我有一个带有布尔值(mask
(的1d 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))
这正是我想要的:
[切片(1,4,无(,切片(6,8,无(]
即生成一个与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
文档的"另请参阅"。