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

时间:2018-12-13 10:52:53

标签: python numpy multidimensional-array numpy-ndarray

例如,我有一个10x7零为x=np.zeros( (10,7) )的ndarray

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中获得,它意味着将元素x [0,6],x [1,2],x [2,5],x [3,1]等设置为0,所以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.]])

如何有效地做到这一点?

1 个答案:

答案 0 :(得分:1)

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