2013-05-11 83 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 

的好处是,你现在可以将此面膜适用于更多的阵列,而无需通过为他们每个人的屏蔽处理下去。

相关问题