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は定数であり、「移動すると毎回同じ値が返されます。xval
yval
zval
zval
z
z
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]
idx
a
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]
idx
a
idx
a
b[idx]
さて、次のような割り当てを行うと
b[a] = 10
値を持つ形状 (6,2,3) の一時的な配列b[a]
が作成され、割り当てが実行されます。10 は定数であるため、この代入は (6,2,3) 形状の配列の各位置に値 10 を配置します。次に、一時配列の値が に再割り当てされb
ます。ドキュメントへの参照を参照してください。したがって、(6,2,3) 形状の配列の値は (6,3) 形状の配列にコピーされますb
。値は互いに上書きします。しかし、要点は、あなたが望んでいる仕事を手に入れられないということです。