python numpy派手なインデックス

3510 ワード

1 import numpy as np
2 rand = np.random.RandomState(42)
3 
4 x = rand.randint(100, size=10)
5 print(x)
[51, 92, 14, 71, 60, 20, 82, 86, 74, 74]

要素の取得:
[x[3], x[7], x[2]]
[71, 86, 14]
#                     
ind = [3, 7, 4] x[ind]
array([71, 60, 86])

派手なインデックスを使用すると、結果のシェイプはインデックス配列のシェイプと一致し、インデックス配列のシェイプと一致しません.
ind = np.array([[3, 7], [4, 5]])
x[ind]
array([[71, 86],
       [60, 20]])

派手なインデックスは、複数の次元にも適用されます.
派手なインデックスが返す値は、インデックス配列の形状ではなく、ブロードキャストされたインデックス配列の形状を反映します.
In [12]: X = np.arange(12).reshape((3, 4))

In [13]: X
Out[13]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [14]: row = np.array([0, 1, 2])

In [15]: col = np.array([2, 1, 3])

In [16]: X[row, col] 
Out[16]: array([ 2,  5, 11]) #       X[0, 2],      X[1, 1]

In [17]: X[row[:, np.newaxis], col]
Out[17]:
array([[ 2,  1,  3],
       [ 6,  5,  7],
       [10,  9, 11]])

In [18]: row[:, np.newaxis] * col
Out[18]:
array([[0, 0, 0],
       [2, 1, 3],
       [4, 2, 6]])

In [19]: row * col
Out[19]: array([0, 1, 6])

In [20]: X[np.array([0, 1, 2]), np.array([2, 1, 3])]
Out[20]: array([ 2,  5, 11])

In [22]: X[np.array([0, 1, 2])[:, np.newaxis], np.array([2, 1, 3])]
Out[22]:
array([[ 2,  1,  3],
       [ 6,  5,  7],
       [10,  9, 11]])

In [23]: np.array([0, 1, 2])[:, np.newaxis]
Out[23]:
array([[0],
       [1],
       [2]])