如何获取NumPy一维数组中连续1的簇的起止索引?
获取NumPy数组中连续1的簇的起始和结束索引
给定一维NumPy数组:
import numpy as np a = np.array([1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1])
要提取所有值为1的连续簇的起始和结束索引,可通过以下NumPy操作实现:
# 生成标记1位置的掩码数组 mask = a == 1 # 给掩码前后补0,处理数组首尾为1的边界情况 padded_mask = np.concatenate([[0], mask, [0]]) # 计算差分,找到簇的边界变化点 diff = np.diff(padded_mask) # 提取簇的起始索引(从0→1的位置) start_indices = np.where(diff == 1)[0] # 提取簇的结束索引(从1→0的位置减1,得到实际最后一个1的索引) end_indices = np.where(diff == -1)[0] - 1 # 组合成预期的嵌套列表格式 clusters = np.column_stack([start_indices, end_indices]).tolist() result = [clusters] print(result)
代码说明
- 掩码生成:
mask数组将原数组中值为1的位置标记为True,其余为False,方便后续识别连续区域。 - 边界补全:在掩码前后添加
0,确保数组开头或结尾就是连续1时,差分操作能捕获到这些边界。 - 差分找边界:
np.diff计算相邻元素的差值,diff == 1对应簇的起始位置(从非1变为1),diff == -1对应簇结束的下一个位置(从1变为非1),因此需要减1得到簇的实际结束索引。 - 结果组合:用
np.column_stack将起始和结束索引配对,转成列表后即可得到符合预期的格式。
运行上述代码后,输出结果为:
[ [[0, 2], [8, 11], [13, 14]] ]
内容的提问来源于stack exchange,提问作者astroboy
相关产品推荐
相关产品推荐

