如何识别连续空区间区域的起始与结束索引?
如何识别连续空区间区域的起始与结束索引?
我来帮你搞定这个问题,咱们结合你提供的示例数据,一步步实现需求:
首先,咱们明确几个核心规则:
- 空区间的判断条件:
interval_start_idxs[i] == interval_end_excl_idxs[i] - 1 - 连续的空区间区域需要满足:多个连续的空区间拥有完全相同的(start, end)值
- 最终要输出每个区域的起始区间索引(包含)和结束区间索引(不包含)
接下来用Numpy高效实现这个逻辑(比纯循环更适配数组类数据):
完整实现代码
import numpy as np # 你的原始输入数据 interval_start_idxs = np.array([0, 3, 3, 3, 6, 7]) interval_end_excl_idxs = np.array([2, 4, 4, 4, 7, 9]) # 步骤1:标记所有空区间,并提取对应的(start, end)对 is_empty = interval_start_idxs == interval_end_excl_idxs - 1 empty_indices = np.where(is_empty)[0] empty_pairs = np.column_stack(( interval_start_idxs[is_empty], interval_end_excl_idxs[is_empty] )) # 步骤2:识别连续的空区间块 empty_interval_starts = [] empty_intervals_ends_excl = [] if len(empty_indices) > 0: # 计算相邻空区间的(start, end)是否发生变化:True表示块的边界 pair_changes = np.concatenate([ [True], (empty_pairs[1:] != empty_pairs[:-1]).any(axis=1) ]) # 提取每个块的起始区间索引(包含) block_starts = empty_indices[pair_changes] # 提取每个块的结束区间索引(不包含) block_ends = np.concatenate([ block_starts[1:], [empty_indices[-1] + 1] ]) # 转换为列表格式 empty_interval_starts = block_starts.tolist() empty_intervals_ends_excl = block_ends.tolist() # 输出结果 print(empty_interval_starts) # 输出: [1, 4] print(empty_intervals_ends_excl) # 输出: [4, 5]
代码逻辑拆解
- 标记空区间:用布尔数组
is_empty筛选出所有符合条件的空区间,同时提取这些区间的(start, end)对和对应的原始区间索引 - 识别连续块:
- 通过比较相邻空区间的(start, end)对,找到块的边界(当前后对不同时,就是新块的开始)
- 每个块的起始是边界对应的区间索引,结束是下一个块的起始(或最后一个空区间索引+1)
- 边界处理:自动兼容没有空区间、只有一个空区间等特殊情况
结果对应解释
- 第一个区域:区间索引
1到4(包含1,不包含4),对应原数据中索引1、2、3的3个连续空区间,它们的(start, end)均为(3,4) - 第二个区域:区间索引
4到5(包含4,不包含5),对应原数据中索引4的单独空区间,(start, end)为(6,7)
备注:内容来源于stack exchange,提问作者pierre_j
相关产品推荐
相关产品推荐

