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)
関数 figure
、hold
および 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")