matlabとnumpy reshapeの違い その2(多次元配列)
以前もnumpy(python)とmatlabのreshapeという関数の仕様の違いについて書いた
may46onez.hatenablog.com
今度は多次元配列(3次元)で引っかかったのでメモしておく。
numpy.reshapeの仕様
numpyで一次元配列(ベクトル)から3次元の配列にreshapeすると以下のようになる。
例として3x4x2の配列を作る。
>>> a = numpy.arange(24) >>> a.reshape((3,4,2)) array([[[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7]], [[ 8, 9], [10, 11], [12, 13], [14, 15]], [[16, 17], [18, 19], [20, 21], [22, 23]]])
これはmatlab風に書くと、
a(:,:,1) = 0 2 4 6 8 10 12 14 16 18 20 22 a(:,:,2) = 1 3 5 7 9 11 13 15 17 19 21 23
という配列である。
numpyでは要素を最後の次元から埋めるので(この場合第3次元, 3x4x2の2から埋める)
a(1,1,:)に0,1が入り、次にa(1,2,:)に2,3が入り...というふうに。
matlabの仕様
一方matlabで同じことをすると、
>> a = 0:23; >> reshape(a, [3,4,2]) ans(:,:,1) = 0 3 6 9 1 4 7 10 2 5 8 11 ans(:,:,2) = 12 15 18 21 13 16 19 22 14 17 20 23
matlabでは要素を最初の次元から埋める。
次元が増えても同じっぽい
解決法
ちょっと調べたけど一発でこの差異をなくす方法がわからない。。
2次元配列をちまちまreshapeしてからcat()
で繋げるとか...?
もうちょっといいやり方があるような気もするけど...