blog.monophile.net

コンピュータに関するメモ。

著者

山本一彰(Takaaki Yamamoto)

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 2015年にコンビネータ論理を基に計算完備な計算手法 "論理珠算"を開発し、 それを含む体系である"算道"を構成した。 その成果により、2016年に 第19回 文化庁メディア芸術祭 アート部門 新人賞 (文部科学大臣賞) を受賞。 現在はSRE(サイト信頼性エンジニア)として生計をたててている。

投稿

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

読み込めた。 めでたしめでたし。

参考