MATLAB形式のファイルをpythonで読み込む
概要
MATLAB のデータを numpy で利用したかったので、scipy で読み込んでみた。
Octave でデータの作成
MATLAB が手元になかったので、Octaveで m.mat を作成。
$ octave -q
octave:1> m = zeros(8, 8)
m =
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
octave:2> m(3:6, 3:6) = 1
m =
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
octave:3> save data.mat m -mat
octave:4> save data.txt m
オプション -mat
を付けない場合はテキストデータなので、コンソールで読める。
data.txt
# Created by Octave 4.2.1, Fri Dec 08 01:32:35 2017 JST <user@hostname>
# name: m
# type: matrix
# rows: 8
# columns: 8
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 1 1 1 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
scipy でMATLAB形式のデータを読み込み
scipy を使用し data.mat を読みこむ。
$ ipython
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import scipy.io
In [2]: data = scipy.io.loadmat("data.mat")
In [3]: type(data["m"])
Out[3]: numpy.ndarray
In [4]: data["m"]
Out[4]:
array([[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 1., 1., 1., 1., 0., 0.],
[ 0., 0., 1., 1., 1., 1., 0., 0.],
[ 0., 0., 1., 1., 1., 1., 0., 0.],
[ 0., 0., 1., 1., 1., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])
↑のようにして読み込むことができた。
scipy で MATLAB 形式のデータを書き込み
逆に書き込むこともできる。 行列データmの中身をすべて -1
したものを data-1.mat として書き込む。
In [5]: data["m"] = data["m"] - 1
In [6]: data["m"]
Out[6]:
array([[-1., -1., -1., -1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1., -1., -1., -1.],
[-1., -1., 0., 0., 0., 0., -1., -1.],
[-1., -1., 0., 0., 0., 0., -1., -1.],
[-1., -1., 0., 0., 0., 0., -1., -1.],
[-1., -1., 0., 0., 0., 0., -1., -1.],
[-1., -1., -1., -1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1., -1., -1., -1.]])
In [7]: scipy.io.savemat("data-1.mat", data)
Octave でMATLAB形式のデータを読み込み
scipy によって作成した data-1.mat をOctaveで読み込む。
$ octave -q
octave:1> load data-1.mat m -mat
octave:2> m
m =
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 0 0 0 0 -1 -1
-1 -1 0 0 0 0 -1 -1
-1 -1 0 0 0 0 -1 -1
-1 -1 0 0 0 0 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
読み込めた。 めでたしめでたし。