2014-10-29 51 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