私はサンプル配列を作成しました:
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]]]
私はこの質問をしましたが、それは私の問題を解決しません。
ドキュメントも役に立ちません。
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
、strides
、およびorder
を変更することで、スワップまたはトランスポーズを実行します(つまり、ビューです)。しかし、ほつれを含め、さらに再形成すると、コピーが作成されます。しかし、それはこの段階で役立つよりも混乱するかもしれません。
numpy
では、軸に番号が付けられています。 x、y、zまたは平面、行、列などの用語は、視覚化できる構成にそれらをマッピングするのに役立ちますが、それらは「組み込み」ではありません。スワップやトランスポーズを言葉で説明するのは難しいです。
これがswapaxes
の私の理解です
配列があるとします
In [1]: arr = np.arange(16).reshape((2, 2, 4))
In [2]: arr
Out[2]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
そして、arr
の形状は(2, 2, 4)
です。値7
の場合、次のようにして値を取得できます
In [3]: arr[0, 1, 3]
Out[3]: 7
3つの軸0、1、2があります。ここで、軸0と2を入れ替えます
In [4]: arr_swap = arr.swapaxes(0, 2)
In [5]: arr_swap
Out[5]:
array([[[ 0, 8],
[ 4, 12]],
[[ 1, 9],
[ 5, 13]],
[[ 2, 10],
[ 6, 14]],
[[ 3, 11],
[ 7, 15]]])
そして、ご想像のとおり、7
のインデックスは(3, 1, 0)
であり、軸1
は変更されません。
In [6]: arr_swap[3, 1, 0]
Out[6]: 7
したがって、インデックスの観点から見ると、軸の交換は値のインデックスを変更するだけです。例えば
In [7]: arr[0, 0, 1]
Out[7]: 1
In [8]: arr_swap[1, 0, 0]
Out[8]: 1
In [9]: arr[0, 1, 2]
Out[9]: 6
In [9]: arr_swap[2, 1, 0]
Out[9]: 6
したがって、交換された軸の配列を取得するのが難しいと感じた場合は、インデックスを変更してください。たとえば、arr_swap[2, 1, 0] = arr[0, 1, 2]
と指定します。