2013-06-21 127 views
5

在這種情況下,爲什麼x += y產生與x = x + y不同的結果?Numpy,爲什麼`x + = y`產生與`x = x + y`不同的結果?

import numpy as np 

x = np.repeat([1], 10) 
y = np.random.random(len(x)) 

x += y 
print x 
# Output: [1 1 1 1 1 1 1 1 1 1] 

x = x + y 
print x 
# Output: [ 1.50859536 1.31434732 1.15147365 1.76979431 1.64727364 
#   1.02372535 1.39335253 1.71878847 1.48823703 1.99458116] 
+0

確實是一個重複的。簡短的回答:取決於執行魔法「dunder」方法'__add__'和'__iadd__' –

+3

**這不是重複的**,這是特定於'numpy' – jamylak

+0

@jamylak哦 - 的確,謝謝! –

回答

9

雖然鏈接的問題介紹了一般性的問題,對於這種特殊情況下的特定numpy的-解釋。基本上,這些答案說「它取決於所涉及的變量的類型」,下面給出的是numpy類型的解釋。

當你做x + y時,numpy對結果使用「最低公分母」數據類型。由於x是int而y是浮點數,這意味着它返回一個浮點數組。

但是,當你做x += y,你迫使它符合x,這是int dtype。這將截斷小數部分,並將所有x值都留在1.這是numpy定義增強賦值運算符的方式:它強制返回值與賦值目標具有相同的dtype。

您可以通過執行x = (x + y).astype(int)(顯式強制dtype返回int)從第二個示例中獲得第一個行爲。您可以通過設置x = np.repeat([1.0], 10)(使用浮點數使x具有dtype浮點數,因此現在可以將y添加到其中而不截斷)從第一個示例中獲得第二個行爲。

2

由於__add____iadd__方法

然而通常的差值可變之間看到VS不變對象

>>> x = np.repeat([1], 10) 
>>> y = np.random.random(len(x)) 
>>> x += y 
>>> x 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) 

對比度與

>>> x = np.repeat([1.0], 10) 
>>> x += y 
>>> x 
array([ 1.05192255, 1.00844068, 1.27569982, 1.40997015, 1.17270114, 
     1.27335121, 1.70719855, 1.72778867, 1.64679031, 1.23241938]) 

所以__iadd__之間的差正在導致添加被截斷回來當x爲int類型

INT這是有道理的,如果你仔細想想 - x不能幻化的類型它的元素(如將它存儲這些額外的字節)

__add__有產區沒有問題一個新的浮游物數組而不是整數

相關問題