You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别连续空区间区域的起始与结束索引?

如何识别连续空区间区域的起始与结束索引?

我来帮你搞定这个问题,咱们结合你提供的示例数据,一步步实现需求:

首先,咱们明确几个核心规则:

  • 空区间的判断条件: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]

代码逻辑拆解

  1. 标记空区间:用布尔数组is_empty筛选出所有符合条件的空区间,同时提取这些区间的(start, end)对和对应的原始区间索引
  2. 识别连续块:
    • 通过比较相邻空区间的(start, end)对,找到块的边界(当前后对不同时,就是新块的开始)
    • 每个块的起始是边界对应的区间索引,结束是下一个块的起始(或最后一个空区间索引+1)
  3. 边界处理:自动兼容没有空区间、只有一个空区间等特殊情况

结果对应解释

  • 第一个区域:区间索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:55:30