为什么使用numpy.ndarrays添加和赋值(+ =)表现奇怪?

时间:2014-10-29 11:14:13

标签: python arrays numpy

考虑以下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数组是否明智?谢谢!

(这只是一个最小的例子,我必须添加几个数组。)

3 个答案:

答案 0 :(得分:9)

操作+=已到位。这意味着它会在第一个示例中更改数组a的内容!

操作c=a使c指向与a完全相同的数据。执行c += b也会将b添加到a

操作d = a也使d指向a。但随后d = d + b会在内存中为d + b分配一个新位置,然后将d引用到此新位置。

如您所见,差异非常重要!对于许多算法,您可以利用其中一个属性来提高效率,但始终需要谨慎。

请参阅here获取教程,here获取深入的问题。

答案 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

从那时起,ac是同一个对象。所以之后,

c += b

你还有c == a