如何在一维NumPy布尔数组中拆分连续True为独立布尔数组列表?
更简洁高效的Numpy实现方法
我们可以借助Numpy的向量化操作快速定位连续True块的边界,生成目标列表的过程更简洁,性能也更优,完全无需依赖自定义的复杂函数。
实现思路与代码:
import numpy as np x = np.array([True, True, False, True, False]) # 给原数组前后补False,方便捕捉首尾的连续True块 extended_x = np.concatenate([[False], x, [False]]) # 转成整数后计算差分,定位True块的起止位置 diff = np.diff(extended_x.astype(int)) starts = np.where(diff == 1)[0] ends = np.where(diff == -1)[0] # 生成仅含单个连续True块的数组列表 l = [] for start, end in zip(starts, ends): block_arr = np.zeros_like(x) block_arr[start:end] = True l.append(block_arr) # 验证结果是否符合要求 y = np.zeros_like(x) for e in l: y |= e print(np.array_equal(y, x)) # 输出 True
关键步骤说明:
- 补边界:给原数组前后添加
False,这样不管原数组开头或结尾是True,都能通过差分操作准确捕捉到连续块的起止点。 - 差分定位:将布尔数组转为整数(
True=1,False=0)后计算差分,差分等于1的位置是连续True块的起始索引,等于-1的位置是结束索引。 - 生成子数组:遍历每一组起止索引,创建全
False数组并将对应区间设为True,加入目标列表即可。
这种方法全程用Numpy的内置向量化操作处理边界定位,比自定义函数更简洁,处理大数组时的性能优势也更明显。
内容的提问来源于stack exchange,提问作者Hojin Cho
相关产品推荐
相关产品推荐

