Integer array indexing
integer-array-indexing | Indexing on ndarrays — NumPy v2.1 Manual
code:py
result = xind_1, ind_2, ..., ind_N
resulti_1, ..., i_M == x[ind_1i_1, ..., i_M, ind_2i_1, ..., i_M, ..., ind_Ni_1, ..., i_M]
次の複雑なレベルにジャンプすると、インデックス配列を使って配列に部分的にしかインデックスを付けないことも可能である。このような場合に何が起こるかを理解するには、少し考える必要がある。
インデックス配列の各値が、インデックスされている配列から1行を選択する新しい配列が構築され、結果として得られる配列は、shape(インデックス要素の数、行のサイズ)を持つことになる。
一般に、結果の配列の形状は、インデックス配列の形状(または、すべてのインデックス配列がブロードキャストされた形状)と、インデックスされた配列の未使用の次元(インデックスされていない次元)の形状を連結したものになります。
連結される順序に2通りあるっぽい?yosider.icon
code:py
import numpy as np
arr = np.arange(3*4*5*6).reshape(3, 4, 5, 6)
# 複数の配列でindexを指定するときは、それぞれの配列の次元が一致している必要がある
idx1 = np.array(0, 1)
idx2 = np.array(1, 2)
1つの次元だけをinteger arrayでindexingする場合
次元の順序は維持される
code:py
arridx1, :, :, :.shape # (2, 4, 5, 6)
arr:, idx1, :, :.shape # (3, 2, 5, 6)
arr:, :, idx1, :.shape # (3, 4, 2, 6)
arr:, :, :, idx1.shape # (3, 4, 5, 2)
複数の次元をindexingする場合は、integer array indexingの次元が先頭に来る
ただし、indexingされる次元が連続している場合は「縮約」され?、(1つの次元だけをinteger arrayでindexingする場合と同様に)次元の順序は維持される
code:py
arridx1, idx2, :, :.shape # (2, 5, 6) 縮約
arridx1, :, idx2, :.shape # (2, 4, 6)
arridx1, :, :, idx2.shape # (2, 4, 5)
arr:, idx1, idx2, :.shape # (3, 2, 6) 縮約
arr:, idx1, :, idx2.shape # (2, 3, 5)
arr:, :, idx1, idx2.shape # (3, 4, 2) 縮約
single element indexingでも同様?
code:py
arr:, 0, :, idx1.shape # (2, 3, 5)
code:py
arridx1, idx2, idx1, :.shape # (2, 6)
arridx1, idx2, :, idx1.shape # (2, 5)
arridx1, :, idx2, idx1.shape # (2, 4)
arr:, idx1, idx2, idx1.shape # (3, 2) 縮約
code:py
arridx1, idx2, idx1, idx2.shape # (2,)
すべてのindexing次元が連続していないと縮約はされず先頭に来る
code:py
import numpy as np
arr = np.arange(3*4*5*6*7).reshape(3, 4, 5, 6, 7)
idx1 = np.array(0, 1)
idx2 = np.array(1, 2)
arr:, idx1, :, idx2, idx2.shape # (2, 3, 5)