考虑以下Python代码:
import numpy
a = numpy.random.rand(3,4)
b = numpy.random.rand(3,4)
c = a
c += b
c/2. - (a + b)/2.
最后一行的结果不是带零的数组。但是,如果我这样做:
d = a
d = d + b
d/2. - (a + b)/2.
然后结果为0,如预期的那样。这看起来很奇怪,任何人都可以解释一下这种行为吗?将+=, /=, ...
用于numpy数组是否明智?谢谢!
(这只是一个最小的例子,我必须添加几个数组。)
答案 0 :(得分:9)
操作+=
已到位。这意味着它会在第一个示例中更改数组a
的内容!
操作c=a
使c
指向与a
完全相同的数据。执行c += b
也会将b
添加到a
。
操作d = a
也使d
指向a
。但随后d = d + b
会在内存中为d + b
分配一个新位置,然后将d
引用到此新位置。
如您所见,差异非常重要!对于许多算法,您可以利用其中一个属性来提高效率,但始终需要谨慎。
答案 1 :(得分:4)
因为行c = a
仅使c指向a。它不会复制。然后c += b
也会添加到。
要添加多个数组,您必须直接执行此操作,或使用求和函数。
c = a + b
c = sum([a, b])
c = numpy.sum([a, b], axis=0)
首先复制数组:
c = a.copy()
c += b
答案 2 :(得分:3)
这是因为当你这样做时:
c = a
从那时起,a
和c
是同一个对象。所以之后,
c += b
你还有c == a