In [1]: import numpy as np
In [2]: a = np.array([[2,0],[3,0],[3,1],[5,0],[5,1],[5,2]])
In [3]: b = np.zeros((6,3), dtype='int32')
In [4]: b[a[:,0], a[:,1]] = 10
In [5]: b
Out[5]:
array([[ 0, 0, 0],
[ 0, 0, 0],
[10, 0, 0],
[10, 10, 0],
[ 0, 0, 0],
[10, 10, 10]])
機能する理由:
代入で2 つのnumpy 配列を使用してインデックスbを作成すると、
b[x, y] = z
次に、NumPy が の各要素と のx各要素とyの各要素を同時に移動し (それらをとz呼びましょう)、b[xval, yval] に value を割り当てると考えてください。Whenは定数であり、「移動すると毎回同じ値が返されます。xvalyvalzvalzvalzz
xの最初の列でaありy、 の 2 番目の列であることで、それが私たちが望んでいることですa。したがって、x = a[:, 0]、およびを選択しますy = a[:, 1]。
b[a[:,0], a[:,1]] = 10
b[a] = 10うまくいかない理由
を記述するときはb[a]、NumPy を , の各要素を移動して新しい配列を作成しa(それぞれを と呼びましょう)、新しい配列のinの位置にidxの値を配置すると考えてください。b[idx]idxa
idxの値ですa。つまり、int32 です。 bの形状は (6,3) であるため、形状 (3,)b[idx]の行も同様です。bたとえばidx、
In [37]: a[1,1]
Out[37]: 0
b[a[1,1]]は
In [38]: b[a[1,1]]
Out[38]: array([0, 0, 0])
そう
In [33]: b[a].shape
Out[33]: (6, 2, 3)
繰り返しましょう: NumPy は、 の各要素を移動し、新しい配列のinの位置にaの値を配置することで、新しい配列を作成しています。上に移動すると、形状 (6,2) の配列が作成されます。しかし、それ自体が (3,) の形をしているので、(6,2) 形の配列の各位置に (3,) 形の値が配置されています。結果は形状 (6,2,3) の配列です。b[idx]idxaidxab[idx]
さて、次のような割り当てを行うと
b[a] = 10
値を持つ形状 (6,2,3) の一時的な配列b[a]が作成され、割り当てが実行されます。10 は定数であるため、この代入は (6,2,3) 形状の配列の各位置に値 10 を配置します。次に、一時配列の値が に再割り当てされbます。ドキュメントへの参照を参照してください。したがって、(6,2,3) 形状の配列の値は (6,3) 形状の配列にコピーされますb。値は互いに上書きします。しかし、要点は、あなたが望んでいる仕事を手に入れられないということです。