2013-05-11 51 views
21

我已經幾次讀過蒙面數組文件,到處搜索,感覺徹底愚蠢。我無法弄清楚如何在一個陣列中應用一個掩模到另一個陣列。如何將一個數組中的掩碼應用到另一個數組?

例子:

import numpy as np 

y = np.array([2,1,5,2])   # y axis 
x = np.array([1,2,3,4])   # x axis 
m = np.ma.masked_where(y>2, y) # filter out values larger than 5 
print m 
[2 1 -- 2] 
print np.ma.compressed(m) 
[2 1 2] 

所以這工作得很好....但繪製該Y軸,我需要一個匹配x軸。如何將y數組中的遮罩應用於x數組?像這樣的東西會是有意義的,但產生的垃圾:

new_x = x[m.mask].copy() 
new_x 
array([5]) 

那麼,如何在地球上是有(注意新的x陣列需要一個新的數組)。

編輯:

嗯,看來要做到這一點的一種方式是這樣的:

>>> import numpy as np 
>>> x = np.array([1,2,3,4]) 
>>> y = np.array([2,1,5,2]) 
>>> m = np.ma.masked_where(y>2, y) 
>>> new_x = np.ma.masked_array(x, m.mask) 
>>> print np.ma.compressed(new_x) 
[1 2 4] 

但是,這是令人難以置信的凌亂!我試圖找到一個解決辦法優雅的IDL ...

+0

難道你不就像'plot(x,m)'而不是做一個new_x嗎? – joris 2013-05-11 08:40:16

+3

它是'n​​ew_x = x [〜m.mask] .copy()'。請注意'〜',因爲掩碼爲True的值被屏蔽。 – joris 2013-05-11 08:41:58

+0

不,我不能將這個注入到繪圖命令中,因爲數據需要事先進行處理,所以我真的需要在多個軸上訪問選定的數據。 – Balthasar 2013-05-11 08:50:39

回答

14

爲什麼不乾脆

import numpy as np 

y = np.array([2,1,5,2])   # y axis 
x = np.array([1,2,3,4])   # x axis 
m = np.ma.masked_where(y>2, y) # filter out values larger than 5 
print list(m) 
print np.ma.compressed(m) 

# mask x the same way 
m_ = np.ma.masked_where(y>2, x) # filter out values larger than 5 
# print here the list 
print list(m_) 
print np.ma.compressed(m_) 

代碼爲Python 2.x的

而且,所提議的里斯,這個做工作new_x = x[~m.mask].copy()給人一種陣列

>>> new_x 
array([1, 2, 4]) 
+0

好東西也謝謝。我明顯是新來的Python和痛苦的方式通過... – Balthasar 2013-05-11 13:07:04

+0

它可以幫助你的答案避免單詞「簡單」,「只是」等。 – 2017-09-21 12:42:34

10

我有一個類似的問題,但涉及的負載更多掩模命令和多個陣列應用它們。我的解決方案是,我在一個陣列上做了所有的遮罩,然後使用最終遮罩陣列作爲mask_where命令中的條件。

例如:

y = np.array([2,1,5,2])       # y axis 
x = np.array([1,2,3,4])       # x axis 
m = np.ma.masked_where(y>5, y)     # filter out values larger than 5 
new_x = np.ma.masked_where(np.ma.getmask(m), x) # applies the mask of m on x 

的好處是,你現在可以將此面膜適用於更多的陣列,而無需通過爲他們每個人的屏蔽處理下去。

相關問題