如何通过另一个数组内的索引更新 ndarray 中的值

How to update value in ndarray by index that is inside another array

例如,我有 10x7 个零数组 x=np.zeros( (10,7) )

array([[0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0.]])

我想在每一行中随机分配一个“1”。假设我创建了另一个数组 (10,1),然后值在 0-6 之间。 r=np.random.randint(0, 7, (10,1))

array([[6],
       [2],
       [5],
       [1],
       [2],
       [4],
       [6],
       [3],
       [0],
       [1]])

我想从 r 这意味着设置为 0 元素 x[0,6] , x[1,2], x[2,5], x[3,1] 等, 所以 x 应该变成

array([[0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0.],
       [0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.]])

如何高效地做到这一点?

r使用一维数组作为列索引。对于行索引,您可以简单地使用一个范围:

In [25]: r=np.random.randint(0, 7, 10)

In [26]: x=np.zeros( (10,7) )

In [27]: x[np.arange(10), r] = 1

In [28]: x
Out[28]: 
array([[0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0.]])