2012-05-24 165 views

回答

41

這是故意的。

+=運算符保留陣列的類型。換句話說,整數數組仍然是一個整數數組。

這使NumPy能夠使用現有陣列存儲執行+=操作。另一方面,a=a+b創建了一個全新的數組,並重新指定a指向這個新數組;這增加了用於該操作的存儲量。

引述documentation

警告:在放操作將執行使用由所述兩個操作數的數據類型所決定的精度的計算,但將靜默向下轉換的結果(如果需要的話),以便它可以適應陣列。因此,對於混合精度計算,A {op}= B可能與A = A {op} B不同。例如,假設a = ones((3,3))。然後,a += 3ja = a + 3j不同:雖然它們都執行相同的計算,但a += 3會將結果轉換回a,而a = a + 3j會將名稱a重新綁定到結果。

最後,如果你想知道爲什麼a是擺在首位的整數數組,考慮以下因素:

In [3]: np.arange(5).dtype 
Out[3]: dtype('int64') 

In [4]: np.arange(5.0).dtype 
Out[4]: dtype('float64') 
+0

我知道a是一個整數,但是,在Python中添加浮點數和整數的預期結果是浮點數,所以這是一個意外的「特徵」 – Dhara

+4

@Dhara:我同意當遇到第一次遇到這種情況。它也可以是有用的。無論如何,我已經從解釋行爲的文檔中添加了一段引文。 – NPE

+0

就地操作可以更快(沒有分配,更好的緩存利用率),並且如果您可以保留對此數組的所有現有引用(如果您有多毛的數據結構)。這些對於C/C++/Fortran背景的程序員也非常有用。 –

8

@aix是完全正確。我只想指出這不是numpy的獨特之處。例如:

>>> a = [] 
>>> b = a 
>>> a += [1] 
>>> print a 
[1] 
>>> print b 
[1] 
>>> a = a + [2] 
>>> print a 
[1, 2] 
>>> print b 
[1] 

正如你可以看到+=修改了列表和+創建一個新的列表。這也適用於numpy。 +創建一個新的數組,因此它可以是任何數據類型。 +=修改陣列的位置,這是不實際的,並且imo可取,因爲當數組內容被修改時numpy改變數組的數據類型。

+0

好點,謝謝 – Dhara

相關問題