我想在不具有相同大小的大型数组上合并多个掩码。在将第一掩模等施加到任意数量的掩模之后制作第二掩模。举个例子,我们假设我们有以下数组并从中创建一个掩码:
A = np.arange(10)
mask1 = (A <= 5)
现在我们想要应用另一个掩码,但仅限于通过mask1的数据,如下所示:
mask2 = (A[mask1] % 2 == 0)
要获取未经屏蔽的数据,您可以这样做:
D = A[mask1][mask2]
但是,如果你有一个任意数量的面具,每个面具都是在最后一个面具之后应用的,那么它会非常麻烦。是否有一种方便的方法来合并蒙版,即使它们的大小不同,但是是从同一个数组构建的?
显然,我能做到,
mask = (A <= 5 & A % 2 == 0)
但由于我需要逐步应用蒙版,因此无法使用我正在处理的数据。否则它只会太慢。
提前致谢。
答案 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])