如何将一个数组中的蒙版应用于另一个数组?

我已经阅读了几次遮罩的数组文档,在各处搜索并且感到非常愚蠢。我一生都无法弄清楚如何将一个面罩从一个阵列应用到另一个阵列。


例子:


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一样优雅的解决方案...


泛舟湖上清波郎朗
浏览 203回答 3
3回答

宝慕林4294392

这可能不是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 arraysx1 = 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 maskmask = x1 > 0.8# apply the mask to all arrays at oncex1, x2, x3, x4 = apply_mask_to_all(m, x1, x2, x3, x4)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python