2012-11-13 49 views
3

我在工作中一直使用蒙面數組,但我遇到的一個問題是蒙面數組的初始化有點笨重。具體來說,ma.zeros()和ma.empty()會返回帶有掩碼的掩碼數組,該掩碼與數組維度不匹配。我想這樣做的原因是,如果我不分配給我的數組的特定元素,它默認情況下會被屏蔽。Python numpy蒙面數組初始化

In [4]: A=ma.zeros((3,)) 
... 
masked_array(data = [ 0. 0. 0.], 
      mask = False, 
     fill_value = 1e+20) 

我可以隨後分配面膜:

In [6]: A.mask=ones((3,)) 
... 
masked_array(data = [-- -- --], 
      mask = [ True True True], 
     fill_value = 1e+20) 

但是爲什麼我應該用兩條線來初始化和數組?或者,我可以忽略ma.zeros()功能,並指定在同一行的面具和數據:

In [8]: A=ma.masked_array(zeros((3,)),mask=ones((3,))) 
... 
masked_array(data = [-- -- --], 
      mask = [ True True True], 
     fill_value = 1e+20) 

但我想這也是笨重。我瀏覽了numpy.ma文檔,但我找不到處理這個問題的簡單方法。我錯過了明顯的東西嗎?

回答

3

那麼,ma.zeros中的面具實際上是一個特殊的常數,ma.nomask,對應於np.bool_(False)。這只是一個佔位符,告訴NumPy面具尚未設置。 使用nomask實際上顯着加快了np.ma:如果事先知道沒有,則不需要跟蹤掩碼值的位置。

最好的辦法是不要明確地設置你的面具,如果你不需要它並且在需要的時候讓np.ma設置它(也就是說,當你最終嘗試取一個負數的日誌時)。


邊注1:在面罩設置爲False的陣列相同的形狀作爲輸入,使用

np.ma.array(..., mask=False) 

這更容易一些。請注意,它實際上是Python False,而不是np.ma.nomask ...同樣,使用mask=True強制屏蔽所有輸入(即mask將爲bool ndarray滿True,形狀與data相同)。


邊注2: 如果您需要設置初始化後的面具,你不應該使用賦值.mask,但分配到特殊值np.ma.masked,它的安全:

a[:] = np.ma.masked 
+0

嗨皮埃爾,謝謝你的回覆。在我的應用程序中,我總是需要一個掩碼,這樣如果我不最終分配給一個索引,它將默認被屏蔽(我編輯了我的問題以更好地反映這一點)。 你的「旁註」似乎給了我一直在尋找的東西! –

0

不幸的是你的旁註爲超過一維數組#2推薦遊:

a = ma.zeros((2,2)) 
a[0][0] = ma.masked 
a 
masked_array(data = 
[[ 0. 0.] 
[ 0. 0.]], 
     mask = 
False, 
    fill_value = 1e+20) 

像OP,我還沒有找到一個整潔的WA在這附近。屏蔽一整排會正確初始化面膜:

a[0] = ma.masked 
a 
masked_array(data = 
[[-- --] 
[0.0 0.0]], 
      mask = 
[[ True True] 
[False False]], 
     fill_value = 1e+20) 

但如果這是不是你想要做的,那麼你必須做a[0] = ma.nomask撤消它是什麼。在a = ma.zeros((2,2))之後立即執行a[0] = ma.nomask不起作用。

+0

我不確定這裏發生了什麼,但答案可能在於「基本」和「高級」索引之間的區別: http://docs.scipy.org/doc/numpy/reference/arrays.indexing .html 1)如果您指定[0,0] = ma.masked,您會發現它的工作方式與您的預期相同。 2)如果您按照已完成的方式(例如[0] [0] = 1)分配值,則其行爲與預期相同。 我不知道爲什麼行爲會分配一個特殊的值和一個浮動,雖然不同。 –