2013-11-21 60 views
3

關於這種古怪的任何想法?NumPy標量,廣播和__iadd__方法

from numpy import * 

a = array([1,2]) 
b = 1 
b += a 

給出array([2,3]),如您所料。但是

a = array([1,2]) 
b = array(1) 
b += a 

給出錯誤「形狀()的非可廣播輸出操作數與廣播形狀(2)不匹配」。同時

a = array([1,2]) 
b = array(1) 
b = b + a 

給出array([2,3])。這種行爲看起來很奇怪嗎?

在此先感謝。

回答

3

+=運營商被認爲是「就地總結」。 Numpy對於原地意味着什麼施加了一些約束:它不能改變數組的大小或dtype。當您執行b = b + a時,沒有問題,因爲b現在指向由添加ba(它是長度爲2的數組)產生的新對象。 b += a失敗並不奇怪,因爲長度2數組無法放入長度爲1的數組中。

關於你的第一個測試的情況下,我的猜測是,因爲Python int爲immutable對象,只要你__iadd__一個,你有效地創建一個新的對象,並指向它,而不是修改你有對象,所以沒有理由不應該使用數組。