我有一个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.]])
那里有什么问题?
答案 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编译的代码就位。