1. ホーム
  2. python

[解決済み] numpy.swapaxesはどのように動作するのですか?

2022-02-15 03:11:26

質問

サンプル配列を作成しました。

a = np.arange(18).reshape(9,2)

印刷すると、このように出力されます。

[[ 0  1]
[ 2  3]
[ 4  5]
[ 6  7]
[ 8  9]
[10 11]
[12 13]
[14 15]
[16 17]]

このリシェイプの実行に際して。

b = a.reshape(2,3,3).swapaxes(0,2)

得ることができる。

[[[ 0  9]
[ 3 12]
[ 6 15]]

[[ 1 10]
[ 4 13]
[ 7 16]]

[[ 2 11]
[ 5 14]
[ 8 17]]]

私はこの質問を通り抜けたが、それは私の問題を解決していない。

NumPyで配列をリシェイプする

ドキュメントも役に立ちません。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.swapaxes.html

スワッピングの仕組み(X軸、Y軸、Z軸)を知りたいのですが。図解で説明していただけると助かります。

どのように解決するのですか?

リシェイプから始める

In [322]: a = np.arange(18).reshape(2,3,3)
In [323]: a
Out[323]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]]])

これは2つの平面として表示され、それぞれの平面は3x3です。 その部分は明確ですか? 配列が一時期(9,2)の形をしていたことは、あまり意味がないんです。 形を変えても要素の順番は変わりません。

を適用します。 swapaxes . 形状は(3,3,2)になりました。 3つの平面、それぞれは3x2です。 この特定の入れ替えは、転置と同じである

np.arange(18).reshape(2,3,3).transpose(2,1,0)

中軸は変化なし。 0,3,6]、[9,12,15]などの列が残っています。

大きさの違う3つの軸で変化を視覚化するとわかりやすいかもしれませんね

In [335]: a=np.arange(2*3*4).reshape(2,3,4)
In [336]: a
Out[336]: 
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]]])
In [337]: a.swapaxes(0,2)
Out[337]: 
array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])

配列を平らにするとどうなるか、注目してください。

In [338]: a.swapaxes(0,2).ravel()
Out[338]: 
array([ 0, 12,  4, 16,  8, 20,  1, 13,  5, 17,  9, 21,  2, 14,  6, 18, 10,
       22,  3, 15,  7, 19, 11, 23])

は、用語の順番を入れ替えたものです。 作成時は[0,1,2,3...]でした。 現在では 1 は6番目の項(2x3)です。

カバーの下 numpy を変更することで、スワップまたはトランスポーズを実行します。 shape , stridesorder データバッファを変更することなく(つまり、ビューである)。 しかし、ラベリングを含むさらなるリシェイプは、コピーを作成することを余儀なくされます。 しかし、それは現段階では役に立つというより、混乱させるかもしれません。

numpy 軸には番号が振られています。 x,y,zやplanes, rows, columnsといった用語は、それらを視覚化できるような構成にマッピングするのに役立つかもしれませんが、「ビルトイン」ではないのです。 スワップやトランスポーズを言葉で表現するのは難しい。