将 1d 掩码数组表示为切片列表

Express 1d masked array as list of slices

我有一个带有布尔值 (mask) 的一维 numpy 数组,我想将其转换为掩码为 True 的切片列表,例如:

mask = [False, True, True, True, False, False, True, True]

我想获得

[slice(1, 4, None), slice(6, 8, None)]

numpy 掩码数组操作(特别是 np.ma.clump_masked())可以做到这一点,但我发现使用它的唯一方法是执行以下操作:

np.ma.clump_masked(np.ma.masked_array(np.ones_like(mask), mask))

这正是我要找的:

[slice(1, 4, None), slice(6, 8, None)]

即生成一个与 mask 具有相同形状的数组,对其应用掩码,然后在其上计算 mask_clumped()

然而,np.ma.masked_array(np.ones_like(mask), mask) 步对我来说似乎是不必要的。有没有什么方法可以从我想象的如下所示的简化操作中获取切片列表?

np.ma.clump_masked(mask)

np.ma.masked_array 需要一个屏蔽数组作为输入,而不是 ndarray。一种方法是做你目前正在做的事情并创建一个屏蔽数组

import numpy as np
mask = np.asarray([False, True, True, True, False, False, True, True])
masked_array = np.ma.masked_array(data=mask, mask=mask)
np.ma.clump_masked(masked_array)

但是,我假设您是根据某些条件生成 mask?在这种情况下,您可以使用 np.ma.masked_where。比如获取0到9的每个偶数的所有切片:

import numpy as np
arr = np.arange(10)
masked_arr = np.ma.masked_where(arr % 2 == 0, arr)
np.ma.clump_masked(masked_arr)

输出:

[slice(0, 1, None),
 slice(2, 3, None),
 slice(4, 5, None),
 slice(6, 7, None),
 slice(8, 9, None)]

还有其他函数,例如np.ma.masked_inside,它会创建一个屏蔽数组并屏蔽某个区间内的所有元素。查看 masked_where 文档的 'see also' 以获得相关函数的列表。