2017-05-29 129 views
2

如果值不在數組中,則np.ma.masked_equalmasked_values不會創建False的掩碼,而是標量。numpy masked_array mask更改類型

實施例:

y = np.arange(10) 
yy = np.ma.masked_equal(y,0) 

產生掩蔽陣列枝條掩模爲10個假值的陣列,而

y = np.arange(1,10) 
yy = np.ma.masked_equal(y,0) 

產生具有設置爲標量假掩模掩蔽陣列。其結果是,因爲在我的代碼,我不事先知道面具是否匹配數組中的任何條目,我不得不明確檢查:

yy=np.ma.masked_values(y,0) 
if np.isscalar(yy.mask): 
    yy.mask=np.zeros(y.shape,dtype=bool) 

這似乎是一個過勞給我。這種行爲的原因是什麼,有沒有辦法避免它?

回答

2

您可以簡單地創建MaskedArray youself:

yy = np.ma.MaskedArray(y, mask=(y==0)) 

看來,NumPy的嘗試,以儘量減少對內存的要求和加快的情況下計算的MaskedArray是暴露無遺。

numpy.ma.nomask

值指示掩蔽陣列具有沒有無效條目。當不需要遮罩時,內部使用nomask加速計算。

如果檢查:

>>> np.ma.nomask 
False 

所以單False表示 「沒有面具」。所以,你也可以查看maskedarr.mask is np.ma.nomask(這是一個garantueed constant):

yy = some_operation_that_creates_a_masked_array 
if yy.mask is np.ma.nomask: 
    yy.mask = np.zeros(yy.shape, dtype=bool) 

攜帶更多的背景,然後np.isscalar

+1

非常感謝。我猜這是有道理的,而且我可能過於熱衷於使用masked_equal或masked_values,但我不確定我是否理解爲什麼numpy試圖最大限度地減少內存需求,而不是直接創建masked_array時使用上下文。 –