我可以在给定索引的数组中设置值,如:
>>> a=np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> a[[1,3,4]]=[-1,-2,-3]
>>> a
array([ 0, -1, 2, -2, -3])
这也适用于布尔掩码。函数np.put
和np.putmask
都做同样的事情,但是通过修改原始数组来完成。有没有办法在不修改原始数组或复制它的情况下执行此操作?我正在寻找的一个例子:
>>> a=np.arange(5)
>>> np.foo(a, [1,3,4], [-1,-2,-3])
array([ 0, -1, 2, -2, -3])
>>> a
array([0, 1, 2, 3, 4])
答案 0 :(得分:3)
只需更改数组副本上的元素即可。
a = np.arange(5)
a
>np.array([0, 1, 2, 3, 4])
b = np.array(a)
b[[1, 3, 4]] = [-1, -2, -3]
a
>np.array([0, 1, 2, 3, 4])
b
>np.array([0, -1, 2, -2, -3])
编辑:请注意,Python非常严格地遵循Command-query separation,除非显然不会造成任何伤害(例如使用list.pop
)。因此,既不鼓励也不可能同时更改列表中的项目并返回该列表。但是,由于您很可能不得不以某种方式存储更改后的列表,因此首次复制原始列表然后更改该列表中的元素时,性能可以忽略不计。
如果您真的想要,可以覆盖__setitem__
的{{1}}方法,或者创建np.ndarray
的新子类并覆盖np.ndarray
,但是再一次,没有必要这样做。