2012-12-10 61 views
1

加權平均的結果不一致。當我計算一個屏蔽數組是完全屏蔽的加權平均,我得到不同的結果爲weights=Noneweights=1在numpy的蒙面陣列

import numpy.ma as ma 
a = ma.arange(2.) 
a[:] = ma.masked        # fully masked 
ma.average(a)        # returns NaN, which is ok since all elements are masked 
ma.average(a, weights=None, returned=True) # returns (NaN, 0.0), which is ok also 
ma.average(a, weights=(1,1), returned=True) # returns 'masked' 

我希望最後兩行以產生相同的結果 - 即相同數量的輸出和相同的值,但它們不相同。最煩人的是,在最後一種情況下,嘗試檢索第二個輸出參數時發生錯誤。爲什麼我會得到這些結果?

回答

2

我同意這種行爲很煩人,但它只是numpy.ma.average編碼的方式。如果你看看its source code,你會看到第505行的if子句的執行方式不同,如果weights=None或者其他東西。

weights != None該操作導致其中一箇中間產品是掩模陣列。稍後在代碼(第562行)中,檢查這些中間數組中的被屏蔽數組,如果爲true,則輸出將始終被屏蔽。另一種情況是weights == None導致NaN被拋出,所以這將是輸出。

別擔心,這種不一致似乎只發生在數組的所有元素被屏蔽的情況下。在現實世界的例子中,將權重設置爲None或者統一數組會得到相同的結果。

+0

感謝您的關注。結論可能是這是一個2級錯誤:第一,函數在被要求輸出它應該返回時崩潰,第二,返回不同的值(至少在語義上)等效輸入... –

+0

@RolfBartstra事實它在最後一種情況下不返回元組應該是一個錯誤。只需在調用之前放入一個'try:除IndexError:'函數外,應該沒問題。或者'if result == ma.masked'。 – tiago