2014-10-29 53 views
1

考虑以下Python代码:为什么添加和分配(+ =)与numpy.ndarrays奇怪行为?

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数组,使用+=, /=, ...是否明智?谢谢!

(这仅是一个小例子,我必须添加几个阵列。)

回答

8

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

操作c=a使得c指向与a完全相同的数据。做c += b也增加ba

操作d = a也使d指向a。但d = d + b然后在内存中分配一个新点到01​​,然后将d引用到这个新点。

正如你所看到的,差异是非常重要的!对于许多算法,您可以利用这些属性中的任何一个来获得效率,但始终需要谨慎。

请参阅here了解教程,here了解深度SO问题。

+1

谢谢您的回答,我已经接受了它,因为它是第一个和最解释性之一。我完全没有考虑过,我只生成了另一个对同一个对象的引用,而不是副本... – Marius 2014-10-29 12:34:47

+0

谢谢,如果我的(因果性?)推论是正确的:欢迎来到数字python世界:) – eickenberg 2014-10-29 12:54:16

4

因为行c = a只会使c指向a。它不会复制一个。然后c += b也增加了一个。

要添加几个数组,您必须直接执行或使用sum函数。

c = a + b 
c = sum([a, b]) 
c = numpy.sum([a, b], axis=0) 

或复制的阵列第一:

c = a.copy() 
c += b 
3

那是因为当你这样做:

c = a 

从此,ac是同一个对象。所以后,

c += b 

你还有c == a