我已经阅读了几次遮罩的数组文档,在各处搜索并且感到非常愚蠢。我一生都无法弄清楚如何将一个面罩从一个阵列应用到另一个阵列。例子:import numpy as npy = np.array([2,1,5,2]) # y axisx = np.array([1,2,3,4]) # x axism = np.ma.masked_where(y>2, y) # filter out values larger than 5print m[2 1 -- 2]print np.ma.compressed(m)[2 1 2]所以这很好用...。但是要绘制此y轴,我需要一个匹配的x轴。如何将掩码从y数组应用于x数组?这样的事情是有道理的,但是会产生垃圾:new_x = x[m.mask].copy()new_xarray([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一样优雅的解决方案...
3 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
这可能不是OP想要知道的100%,但这只是我一直使用的一小段代码-如果您想以相同的方式屏蔽多个数组,则可以使用此通用函数来屏蔽动态数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)
添加回答
举报
0/150
提交
取消