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
こうなってしまう。
列から埋めるか、行から埋めるかという違いがあるらしい。
pythonでmatlabと同じような結果にするには、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での結果をpythonのorder="C"
の場合にする方法は、調べたところよくわからない。。
なので以下のようにする
% in matlab >> reshape(a,[4,3]).' ans = 0 1 2 3 4 5 6 7 8 9 10 11
普通にreshape
してから.'
で転置をとるだけである。
pythonに慣れてたので不意打ちを食らった