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