【问题标题】:Merge multiple masks with different sizes合并多个不同大小的蒙版
【发布时间】:2017-03-02 05:04:51
【问题描述】:

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

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

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

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

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

D = A[mask1][mask2]

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

显然,我可以做到,

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

但这对于我正在处理的数据是不可能的,因为我需要逐步应用掩码。否则它只会太慢。

提前致谢。

【问题讨论】:

  • 如果你有一个这样的掩码列表,你可以循环并在每次迭代时获得切片。那么,像A = A[mask_each_iteration] 之类的或者不破坏输入数组,将A 复制到输出数组中:out = A.copy() 然后在循环中进行这样的切片?因为mask2 将依赖于mask1 等等,所以您需要一些迭代过程。
  • 我想下面的方法会起作用:total_mask = np.zeros(len(mask1))q = 0for i in range(len(mask1)):if mask1[i] == 1:total_mask[i] = (mask2[q] == 1)q += 1这似乎不是一个非常漂亮的方法,但是,可能只是工作。

标签: python arrays numpy merge mask


【解决方案1】:

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

因此,我们可以做 -

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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多