pythonでMATLAB互換のmatファイルを保存する

pythonでmat保存するときの型についての話

Sun, 15 Oct 2017

はじめに

pythonで処理したデータを保存するときにどの形式で保存しようってなります.

numpyの機能でも保存できるけど独自規格だし種類もいっぱいあっていまいちです・・・

csvとかだとテキストデータになるので容量がめちゃくちゃ大きくなります.

そこで選んだのがMATLABでおなじみのmatファイルです.

pythonからmatで保存すればMATLABでも使えますし容量も小さくいい感じです.

この記事ではpythonのどの変数型がmatlabのどの変数に対応するかを説明します.

 

pythonからmat保存する

pythonからmatファイルを保存するにはscipy.ioを使います.

使い方はこんな感じ.

scipy.io.savemat(filename, {“matval1”:pyval1})

matvalがmatに保存される変数名,pyvalがpythonで使っていた変数です.

参考:https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.io.savemat.html

 

例えばこんな感じです.

# -*- coding: utf-8 -*-

# インクルード
import numpy as np
import scipy.io

# データ作成
data = np.arange(10)

# mat保存
scipy.io.savemat("test.mat", {'name':data})

matファイルをMATLAB開くとこんな感じです.

66c19942ab4ba346fdb64ccc04cde373 300x68

 

 

データ型の互換性

scipyは優秀なのでpythonの変数をMATLAB対応のものに変換してくれます.

数値の型ならまあintだとかfloatだとか気にするだけですが,文字列とか構造体はややこしく感じたのでまとめます.

(pythonとかMATLABの専門用語は詳しくないので,言葉の使い方を間違ってる箇所があるかもしれません.)

 

文字列

classがlistの要素がstrで保存すると**MATLABではcharで保存されます.**

# -*- coding: utf-8 -*-

# インクルード
import numpy as np
import scipy.io

# データ作成
strarr = ["python", "matlab"]

# mat保存
scipy.io.savemat("test.mat", {'name':strarr})

66c19942ab4ba346fdb64ccc04cde373 1

 

numpyのobject型を使うと,MATLABでcellとなります.

# -*- coding: utf-8 -*-

# インクルード
import numpy as np
import scipy.io

# データ作成
strarr = np.array(["python", "matlab"], dtype=object)

# mat保存
scipy.io.savemat("test.mat", {'name':strarr})

66c19942ab4ba346fdb64ccc04cde373 2

 

 

構造体

dictを使うとMATLABではこうなります.

# -*- coding: utf-8 -*-

# インクルード
import numpy as np
import scipy.io

# データ作成
val1 = np.arange(10)
val2 = np.arange(15)
dict = {"python":val1, "matlab":val2}

# mat保存
scipy.io.savemat("test.mat", {'name':dict})

66c19942ab4ba346fdb64ccc04cde373 3 300x145

 

numpyのStructured arraysを使うと別の感じになります.

# -*- coding: utf-8 -*-

# インクルード
import numpy as np
import scipy.io

# データ作成
arr = np.zeros((10,), dtype=[('pyhton','f8'),('matlab','f8')])

# mat保存
scipy.io.savemat("test.mat", {'name':arr})

66c19942ab4ba346fdb64ccc04cde373 4

© anbalab 2019