我已经多次阅读了屏蔽数组文档,到处搜索,感觉非常愚蠢。我无法弄清楚如何将一个数组中的掩码应用到另一个数组中。
示例:
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 一样优雅的解决方案...
我遇到了类似的问题,但涉及加载更多屏蔽命令和更多数组来应用它们。我的解决方案是在一个数组上执行所有屏蔽,然后使用最终屏蔽的数组作为
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
好处是您现在可以将此掩码应用于更多阵列,而无需对每个数组执行掩码过程。
为什么不简单地
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
此外,正如 joris 所提议的,这可以完成工作
new_x = x[~m.mask].copy()
给出一个数组
>>> new_x
array([1, 2, 4])
这可能不是 100% OP 想知道的, 但这是我一直使用的一段可爱的小代码 - 如果你想以同样的方式屏蔽多个数组,你可以使用这个通用函数一次屏蔽动态数量的 numpy 数组:
def apply_mask_to_all(mask, *arrays):
assert all([arr.shape == mask.shape for arr in arrays]), "All Arrays need to have the same shape as the mask"
return tuple([arr[mask] for arr in arrays])
请参阅此示例用法:
# init 4 equally shaped arrays
x1 = np.random.rand(3,4)
x2 = np.random.rand(3,4)
x3 = np.random.rand(3,4)
x4 = np.random.rand(3,4)
# create a mask
mask = x1 > 0.8
# apply the mask to all arrays at once
x1, x2, x3, x4 = apply_mask_to_all(m, x1, x2, x3, x4)
我知道这是一篇旧文章,但对于那些可能想以更直接的方式完成类似事情的人来说:
方法一:
import numpy as np
y = np.array([2,1,5,2])
x = np.array([1,2,3,4])
locs=~(y>2)
new_x=x[locs]
new_y=y[locs]
print('locs: ', locs)
print('new_x: ', new_x)
print('new_y: ', new_y)
输出:
locs: [ True True False True]
new_x: [1 2 4]
new_y: [2 1 2]
方法2:
import numpy as np
y = np.array([2,1,5,2])
x = np.array([1,2,3,4])
locs=np.where(~(y>2))[0]
new_x=x[locs]
new_y=y[locs]
print('locs: ', locs)
print('new_x: ', new_x)
print('new_y: ', new_y)
输出:
locs: [0 1 3]
new_x: [1 2 4]
new_y: [2 1 2]