pythonでMATLAB互換のmatファイルを保存する
pythonでmat保存するときの型についての話
はじめに
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開くとこんな感じです.
データ型の互換性
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})
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})
構造体
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})
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})