直接 DataFrameTable 変数に変換したい

近年、MATLAB のヴァージョンが上がる毎に Python との連携が強化されつつあります。
従来は、Parquetcsv ファイルに保存してから再度読み込む方法などが推奨されていましたが、ファイルに保存なんて野暮ったい感じもするので、直接受け渡しができる方法をご紹介します。
DataFrameTable に変換して、MATLAB のデータ解析環境で直ぐに使う方法を備忘録的に記しておきます。

注意
この記事は、MATLAB から Python を呼び出す場合を想定しています。
Python から MATLAB を呼び出す方法は、Call MATLAB Functions from Python などを参照してください。

0. 基本設定の確認

利用する MATLAB ヴァージョンを確認しておきます。

MATLAB Code
version
Output
ans = '9.13.0.2049777 (R2022b)'

R2022b で実行します。

R2022b 以前のバージョンでエラーが出たら
これより古いヴァージョンの方は、Python から MATLAB に戻ってくる変数を cell 型で受けたりすることで、エラーを解消できると思います。例えば、下でご紹介する:

MATLAB Code
- columnNames = string(pyDataFrame.columns.tolist()) % R2019b ではエラー発生
+ columnNames = string(cell(pyDataFrame.columns.tolist())) % cell を使って解決

などがあります。

Python 連携する際は、最初にマシンにインストールされている MATLAB と連携させる Python の情報を確認します:

MATLAB Code
pyenv
Output
ans = 
  PythonEnvironment のプロパティ:

          Version: "3.9"
       Executable: "C:\Users\myName\AppData\Local\WPy64-39100\python-3.9.10.amd64\python.exe"
          Library: "C:\Users\myName\AppData\Local\WPy64-39100\python-3.9.10.amd64\python39.dll"
             Home: "C:\Users\myName\AppData\Local\WPy64-39100\python-3.9.10.amd64"
           Status: NotLoaded
    ExecutionMode: InProcess

注意
myName の部分は私のユーザー名元々入っています

1. サンプルデータ作成

numpy array を作成します

MATLAB Code
pynumpy = py.numpy.array([1,2,3;4,5,6;7,8,9])
Output
pynumpy = 
  Python ndarray:

     1     2     3
     4     5     6
     7     8     9
    Python オブジェクトのプロパティを表示するには、関数 details を使用します。

    MATLAB 配列に変換するには、関数 double を使用します。

Python と比較
numpy.array は Python だと行列は [ ] で囲みますが、MATLAB では ";" で改行できます

Python Code
pynumpy = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

コラム名を指定し、先ほど作成した pynumpy を渡して、DataFrame を作成します。

MATLAB Code
pyDataFrame = py.pandas.DataFrame(pynumpy,columns={'a','b','c'})
Output
pyDataFrame = 
  Python DataFrame とそのプロパティ:

          T: [1x1 py.pandas.core.frame.DataFrame]
         at: [1x1 py.pandas.core.indexing._AtIndexer]
      attrs: [1x1 py.dict]
       axes: [1x2 py.list]
    columns: [1x1 py.pandas.core.indexes.base.Index]
     dtypes: [1x1 py.pandas.core.series.Series]
      empty: 0
      flags: [1x1 py.pandas.core.flags.Flags]
        iat: [1x1 py.pandas.core.indexing._iAtIndexer]
       iloc: [1x1 py.pandas.core.indexing._iLocIndexer]
      index: [1x1 py.pandas.core.indexes.range.RangeIndex]
        loc: [1x1 py.pandas.core.indexing._LocIndexer]
       ndim: [1x1 py.int]
      shape: [1x2 py.tuple]
       size: [1x1 py.numpy.int32]
     values: [1x1 py.numpy.ndarray]
         a    b    c
    0  1.0  2.0  3.0
    1  4.0  5.0  6.0
    2  7.0  8.0  9.0

Python と比較
Python だと以下のように DataFrame 作成時に columnslist['a','b','c'] を渡します。
MATLAB だと {'a','b','c'}cell 型で渡しています。

Python Code
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c'])

2. MATLAB Table 型に DataFrame を変換

3 ステップで変換できます。

Step 1: DataFrame Value を MATLAB array にします

MATLAB Code
value = double(pyDataFrame.values)
Output
value = 3x3    
     1     2     3
     4     5     6
     7     8     9

原理
pyDataFrame.values の中身は numpy ndarray
MATLAB の数値配列型に double 関数で一発で変換できます。

MATLAB Code
pyDataFrame.values
Output
ans = 
  Python ndarray:

     1     2     3
     4     5     6
     7     8     9
    Python オブジェクトのプロパティを表示するには、関数 details を使用します。

    MATLAB 配列に変換するには、関数 double を使用します。

Python - MATLAB 間のデータ型のマッピングは
MATLAB to Python Data Type Mapping
にまとまっています。

Step 2: DataFrame column 名を取り出します

  1. column 名 を Python list 型に変換
  2. list 型変数を、MATLAB string に変換
MATLAB Code
columnNames = string(pyDataFrame.columns.tolist())
Output
columnNames = 1x3 string    
"a"          "b"          "c"          

Step 3: array2table で MATLAB Talbe 型を作成

MATLAB Code
tbl = array2table(value,VariableNames=columnNames)

output:

a b c
1 1 2 3
2 4 5 6
3 7 8 9

まとめ

DataFrame は Python のデータ解析では必須のデータ型です。一方、MATLAB のそれは、TableTimetable 型ですが、Python 連携を考えるとこの2つの受け渡しはスムースにしたいところ。Parquet や csv ファイルでのやり取りも MathWorks から推奨もされていますが、ファイルに吐き出さずに優雅に実現する方法を今回はご紹介しました。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626812.html

相关文章:

  • 2022-12-23
  • 2021-11-28
  • 2021-04-28
  • 2021-08-25
  • 2021-06-03
  • 2021-08-06
  • 2022-12-23
  • 2021-10-16
猜你喜欢
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
  • 2022-02-19
  • 2022-02-21
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案