備忘録とか日常とか

学んだこととかを書きます。

matlabとnumpy reshapeの違い

matlabは特に行列計算が容易に書けるが、ライセンスが有料なので気軽には使えなかった。そこで無料で導入できるpythonに、matlabのような使い勝手の良い数値計算ライブラリ(numpyとかmatplotlibとか)が開発されたわけである。機械学習を利用する上で便利な言語としてpythonが使われだしたのも、これらのライブラリが開発された頃からであるとどっかの本で読んだ気がしなくもない。

matlabを使っている時に、行列の構造を変えるreshapeという関数でつまずいたのでメモしておく。
pythonにもnumpy.ndarrayの中に全く同じ名前のメソッドがあるが、若干仕様が違う。

例えば以下のようなベクトルがあるとする

% in matlab
>> a = [0 1 2 3 4 5 6 7 8 9 10 11]

a =

     0     1     2     3     4     5     6     7     8     9    10    11

これをreshapeして(3,4)の行列にするのだが、pythonだと以下のようになる

# in python
>> a.reshape((3,4))
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

これに対し、matlabで普通にreshape関数を使うと

% in matlab
>> reshape(a,[3,4])

ans =

     0     3     6     9
     1     4     7    10
     2     5     8    11

こうなってしまう。
列から埋めるか、行から埋めるかという違いがあるらしい。

pythonmatlabと同じような結果にするには、orderという引数を与える。

# in python
>> a.reshape((3,4),order="F")
array([[ 0,  3,  6,  9],
       [ 1,  4,  7, 10],
       [ 2,  5,  8, 11]])

こんな感じ。デフォルトではorder="C"となっている。詳しくはドキュメントを参照

matlabでの結果をpythonorder="C"の場合にする方法は、調べたところよくわからない。。
なので以下のようにする

% in matlab
>> reshape(a,[4,3]).'

ans =

     0     1     2     3
     4     5     6     7
     8     9    10    11

普通にreshapeしてから.'で転置をとるだけである。


pythonに慣れてたので不意打ちを食らった