如何基于另一个数组修改numpy数组的值?

时间:2019-12-06 02:42:17

标签: python arrays numpy

我有一个numpy数组。我想通过另一个数组的选定元素来修改一个数组索引。例如:

import numpy as np
t1 = np.ones((10,3))
t2 = np.arange(10)
t1[np.where(t2>5)][:,2] = 10
print(t1)

我想要的t1是:

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

但是t1的输出是:

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

那里有什么问题?

3 个答案:

答案 0 :(得分:1)

它是向后的,应该是:

t1[:,2][np.where(t2>5)] = 10

输出:

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

答案 1 :(得分:1)

您可以这样做:

t1[np.where(t2>5), 2] = 10

语法array[<row>, <col>]

答案 2 :(得分:1)

最Python化的方式可能是

np.where(t2 > 5,           # where t2 > 5
         10,               # put 10
         out = t1[:, 2])   # into the third column of t1

除了增加清晰度之外,对于非常大的对象,这将带来时间上的好处,因为不会创建中间索引数组np.where(t2 > 5),也不会产生对该python对象的中间回调-一切都完成了用C编译的代码就位。