3D NumPy配列のスライス 質問する

3D NumPy配列のスライス 質問する

次の点を考慮してください。

A = np.zeros((2,3))
print(A)

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

これは私には理にかなっています。NumPy に 2x3 行列を作成するように指示すると、それが得られます。

ただし、次のとおりです。

B = np.zeros((2, 3, 4))
print(B)

次のようになります:

[[[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]

 [[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]]

これは私には意味がわかりません。numpy に 4 つの 2x3 行列を持つ立方体を作成するように指示しているのではないでしょうか。データ構造は間違っているように見えますが、スライスは計画どおりに機能するため、さらに混乱しています。

print(B[:,:,1])

[[ 0.  0.  0.]
 [ 0.  0.  0.]]

これらの配列の構築方法について何かが足りないのですが、それが何なのかよくわかりません。何が足りないのか、または理解していないのかを誰か説明してもらえますか?

本当にありがとう!

ベストアンサー1

NumPy 配列は、最初に左端の軸を反復します。したがって、Bの形状が (2,3,4) の場合、B[0]の形状は (3,4) になり、 のB[1]形状は (3,4) になります。この意味で、 は形状が (3,4) の 2 つの配列と考えることができますB。 の repr で 2 つの配列を確認できますB

In [233]: B = np.arange(2*3*4).reshape((2,3,4))
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],       <-- first (3,4) array 
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],      <-- second (3,4) array 
        [20, 21, 22, 23]]])

B最初に最後のインデックスを反復処理することで、 に 4 つの 2x3 配列が含まれていると考えることもできます。

for i in range(4):
    print(B[:,:,i])

# [[ 0  4  8]
#  [12 16 20]]
# [[ 1  5  9]
#  [13 17 21]]
# [[ 2  6 10]
#  [14 18 22]]
# [[ 3  7 11]
#  [15 19 23]]

Bしかし、 3 つの 2x4 配列として考えることもできます。

for i in range(3):
    print(B[:,i,:])

# [[ 0  1  2  3]
#  [12 13 14 15]]
# [[ 4  5  6  7]
#  [16 17 18 19]]
# [[ 8  9 10 11]
#  [20 21 22 23]]

NumPy配列はこのように完全に柔軟です。しかし、のに関してreprB見るB最初に左端の軸を反復処理するため、2 つの (3x4) 配列に対応します。

for arr in B:
    print(arr)

# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
# [[12 13 14 15]
#  [16 17 18 19]
#  [20 21 22 23]]

おすすめ記事