合并多个不同大小的蒙版

时间:2016-10-20 09:20:25

标签: python arrays numpy merge mask

我想在不具有相同大小的大型数组上合并多个掩码。在将第一掩模等施加到任意数量的掩模之后制作第二掩模。举个例子,我们假设我们有以下数组并从中创建一个掩码:

A = np.arange(10)
mask1 = (A <= 5)

现在我们想要应用另一个掩码,但仅限于通过mask1的数据,如下所示:

mask2 = (A[mask1] % 2 == 0)

要获取未经屏蔽的数据,您可以这样做:

D = A[mask1][mask2]

但是,如果你有一个任意数量的面具,每个面具都是在最后一个面具之后应用的,那么它会非常麻烦。是否有一种方便的方法来合并蒙版,即使它们的大小不同,但是是从同一个数组构建的?

显然,我能做到,

mask = (A <= 5 & A % 2 == 0)

但由于我需要逐步应用蒙版,因此无法使用我正在处理的数据。否则它只会太慢。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以存储这些有效索引,并在每次迭代时使用基于先前索引的当前索引索引到先前的索引,以根据原始输入数组中的位置获取当前索引。

因此,我们可以做 -

idx1 = np.flatnonzero(mask1) # Store indices
idx2 = np.flatnonzero(mask2)
final_idx = idx1[idx2]

我们会使用final_idx索引到最终选择的输入数组。

要将其扩展为通用数量的掩码,迭代过程看起来像这样 -

list_of_masks = [mask1,mask2,mask3]
idx = np.arange(A.shape[0])
for m in list_of_masks:
    idx = idx[np.flatnonzero(m)]

示例运行 -

In [104]: A = np.arange(20)

In [105]: # Let's create three iterative masks
     ...: mask1 = (A <= 5)
     ...: mask1[1] = 0
     ...: mask1[2] = 0
     ...: mask2 = (A[mask1] % 2 == 0)
     ...: mask3 = (A[mask1][mask2] % 3 == 0)
     ...: 

In [106]: A[mask1][mask2][mask3] # Original approach
Out[106]: array([0])

In [107]: list_of_masks = [mask1,mask2,mask3]
     ...: idx = np.arange(A.shape[0])
     ...: for m in list_of_masks:
     ...:     idx = idx[np.flatnonzero(m)]
     ...:     

In [108]: A[idx] # New approach to use final idx
Out[108]: array([0])