合并多个不同大小的蒙版

Merge multiple masks with different sizes

我想在一个大小不同的大数组上合并多个蒙版。在将第一个掩模等应用到任意数量的掩模之后,制作第二个掩模。例如,假设我们有以下数组并从中创建一个掩码:

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

现在我们要应用另一个掩码,但只对通过掩码 1 的数据应用,如下所示:

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

要获取未屏蔽的数据,您可以执行以下操作:

D = A[mask1][mask2]

但是,如果您有任意数量的蒙版,每个蒙版都在最后一个蒙版之后应用,那将变得非常麻烦。有没有一种方便的方法来合并掩码,即使它们大小不同,但是由同一个数组构造的?

显然,我可以,

mask = (A <= 5 & A % 2 == 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])