Main Content

Python からの MATLAB データの並べ替えとプロット

この例では、Python® で患者データを喫煙者と非喫煙者のリストに並べ替え、MATLAB® を使用して患者の血圧測定値をプロットする方法を示します。

エンジンを起動し、一連の患者データを MATLAB テーブルに読み取ります。MATLAB では、100 人の異なる患者情報を含む、サンプルのコンマ区切りファイル patients.dat を提供します。

import matlab.engine
eng = matlab.engine.start_matlab()
eng.eval("T = readtable('patients.dat');",nargout=0)

MATLAB 関数 readtable はデータをテーブルに読み取ります。エンジンは、MATLAB テーブルのデータ型をサポートしません。ただし、MATLAB 関数 table2struct を使用すると、そのテーブルをエンジンがサポートするデータ型であるスカラー構造に変換できます。

eng.eval("S = table2struct(T,'ToScalar',true);",nargout=0)
eng.eval("disp(S)",nargout=0)
                    LastName: {100x1 cell}
                      Gender: {100x1 cell}
                         Age: [100x1 double]
                    Location: {100x1 cell}
                      Height: [100x1 double]
                      Weight: [100x1 double]
                      Smoker: [100x1 double]
                    Systolic: [100x1 double]
                   Diastolic: [100x1 double]
    SelfAssessedHealthStatus: {100x1 cell}

S は、MATLAB ワークスペースから Python セッションに渡すことができます。エンジンは、S を Python ディクショナリ D に変換します。

D = eng.workspace["S"]

S には配列を含むフィールドがあります。エンジンは、cell 配列を Python list 変数に変換し、数値配列を MATLAB 配列に変換します。したがって、D["LastName"] はデータ型 list であり、D["Age"] はデータ型 matlab.double です。

喫煙者と非喫煙者のリストに血圧測定値を並べ替えます。patients.dat では、Smoker 列は、logical 1 (true) で喫煙者を示し、logical 0 (false) で非喫煙者を示しました。D["Smoker"] を配列 matlab.logical に変換して並べ替えます。

smoker = matlab.logical(D["Smoker"])

Diastolic 血圧測定値と Smoker インジケーターを 1 列 100 行の MATLAB 配列に並べ替えます。

pressure = D["Diastolic"]
pressure.reshape((1,100))
pressure = pressure[0]
smoker.reshape((1,100))
smoker = smoker[0]

配列 pressure を喫煙者と非喫煙者の血圧測定値のリストに並べ替えます。Python リスト内包表記では、シーケンスの反復用の圧縮メソッドを提供します。Python 関数 zip を使用すると、単一の for ループ内で複数のシーケンスを反復することができます。

sp = [p for (p,s) in zip(pressure,smoker) if s is True]
nsp = [p for (p,s) in zip(pressure,smoker) if s is False]

list 内の喫煙者の血圧測定値 sp の長さを表示します。

print(len(sp))
34

非喫煙者の測定値の list である nsp の長さを表示します。

print(len(nsp))
66

喫煙者と非喫煙者の血圧測定値の平均を計算します。sp および nsp を MATLAB 関数 mean に渡す前に MATLAB 配列に変換します。

sp = matlab.double(sp)
nsp = matlab.double(nsp)
print(eng.mean(sp))
89.9117647059

非喫煙者の平均血圧を表示します。

print(eng.mean(nsp))
79.3787878788

喫煙者と非喫煙者の血圧測定値をプロットします。プロット用に 2 つの x 軸を定義するには、MATLAB 関数 linspace を呼び出します。34 人の喫煙者と 66 人の非喫煙者を 1 つの散布図にプロットできます。

sdx = eng.linspace(1.0,34.0,34)
nsdx = eng.linspace(1.0,34.0,66)

関数 box を使用して軸の境界を示します。

eng.figure(nargout=0)
eng.hold("on",nargout=0)
eng.box("on",nargout=0)

関数 figurehold および box は出力引数を返さないため、nargout=0 を指定して呼び出さなければなりません。

喫煙者と非喫煙者の血圧測定値をプロットし、そのプロットにラベルを付けます。多くの MATLAB 関数の場合、エンジンは MATLAB グラフィックス オブジェクトにハンドルを返すことができます。MATLAB オブジェクトのハンドルを Python 変数に保存できますが、Python でオブジェクトのプロパティを操作することはできません。MATLAB オブジェクトを入力引数として他の MATLAB 関数に渡すことができます。

eng.scatter(sdx,sp,10,'blue')
<matlab.object object at 0x22d1510>

この例の残りの部分では、MATLAB 関数の出力引数をプレースホルダーとして h に割り当てます。

h = eng.scatter(nsdx,nsp,10,'red')
h = eng.xlabel("Patient (Anonymized)")
h = eng.ylabel("Diastolic Blood Pressure (mm Hg)")
h = eng.title("Blood Pressure Readings for All Patients")
h = eng.legend("Smokers","Nonsmokers")

喫煙者と非喫煙者の血圧測定値の平均を示すラインを引きます。

x = matlab.double([0,35])
y = matlab.double([89.9,89.9])
h = eng.line(x,y,"Color","blue")
h = eng.text(21.0,88.5,"89.9 (Smoker avg.)","Color","blue")
y = matlab.double([79.4,79.4])
h = eng.line(x,y,"Color","red")
h = eng.text(5.0,81.0,"79.4 (Nonsmoker avg.)","Color","red")

Plot of blood pressure readings for all patients.

参考

|