備忘録とか日常とか

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

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()で繋げるとか...?

もうちょっといいやり方があるような気もするけど...