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]])