如何返回一个数组,其中给定索引的值被新值替换?

时间:2017-07-11 18:20:08

标签: python numpy

我可以在给定索引的数组中设置值,如:

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

1 个答案:

答案 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,但是再一次,没有必要这样做。