基本问题是:执行以下操作时,幕后会发生什么: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
-
a += x
是相同的a.__iadd__(x)
,就地添加
但当我这样做时会发生什么:
a[i] += x
具体来说:
- 这是否与
a[i] = a[i] + x
? (这不是就地操作)
- Does it make a difference in this case if
i
is:
- an
int
索引,或
- an
ndarray
, or
- a
slice
object
背景
我开始深入研究这个问题的原因是我在处理重复索引时遇到了不直观的行为:
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.])
关于重复索引的更多有趣的事情这个问题 https://stackoverflow.com/questions/15973827/handling-of-duplicate-indices-in-numpy-assignments/16033516#16033516.
你需要意识到的第一件事是a += x
不完全映射到a.__iadd__(x)
,而是映射到a = a.__iadd__(x)
。请注意,文档 http://docs.python.org/3.3/reference/datamodel.html#object.__iadd__特别指出就地运算符返回其结果,并且这不必是self
(尽管在实践中,通常是这样)。这意味着a[i] += x
简单地映射到:
a.__setitem__(i, a.__getitem__(i).__iadd__(x))
所以,添加技术上就地发生,但仅发生在临时对象上。仍然可能比调用时创建的临时对象少一个__add__
, 尽管。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)