基本问题是:在执行以下操作时会发生什么:a[i] += b
?
鉴于以下情况:
import numpy as np
a = np.arange(4)
i = a > 0
i
= array([False, True, True, True], dtype=bool)
我的理解是:
a[i] = x
和a.__setitem__(i, x)
一样,直接赋值给i表示的item
a += x
与a.__iadd__(x)
相同,即原地加法
但是当我这样做时会发生什么:
a[i] += x
具体来说:
- 这和
a[i] = a[i] + x
一样吗? (这不是就地操作) - 在这种情况下,如果
i
是:int
索引,或者- 一个
ndarray
,或者 - 一个
切片
对象
背景
我开始研究这个的原因是我在处理重复索引时遇到了一个非直觉的行为:
a = np.zeros(4)
x = np.arange(4)
indices = np.zeros(4,dtype=np.int) # duplicate indices
a[indices] += x
a
= array([ 3., 0., 0., 0.])
关于重复索引的更多有趣内容在 this question 中.
最佳答案
您需要意识到的第一件事是 a += x
并不完全映射到 a.__iadd__(x)
,而是映射到 a = a.__iadd__(x)
。请注意 documentation具体说就地运算符返回它们的结果,这不一定是 self
(尽管在实践中,它通常是)。这意味着 a[i] += x
平凡地映射到:
a.__setitem__(i, a.__getitem__(i).__iadd__(x))
因此,加法技术上发生在原地,但仅发生在临时对象上。不过,与调用 __add__
相比,创建的临时对象仍然可能较少。
关于python - numpy 的就地操作(例如 `+=` )如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034672/