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

如何简洁获取numpy一维数组首个连续True序列的首尾索引

如何快速找到numpy布尔数组中首个连续True序列的首尾索引

问题描述

我有一个numpy一维布尔数组,示例如下:

import numpy as np
a = np.array([False, True, True, True, False, True, True, False])

需要获取两个索引:

  • 数组中第一个True值的索引(此示例为1)
  • 首个连续True序列的最后一个索引(此示例为3)

假设数组中至少存在一个True值,以下是更多测试示例及预期输出:

[False, True, True] # 预期输出:1, 2
[True, True, True, False, True, True, False] # 预期输出:0, 2
[False, True, True, True] # 预期输出:1, 3
[False, True, False, True] # 预期输出:1, 1

简洁实现方案

利用numpy内置的高效函数可以快速实现需求,这里提供两种简洁的写法:

方法一:基于np.argmax的直接定位

import numpy as np

def get_first_true_range(arr):
    # 找到第一个True的索引(True对应数值1,argmax返回第一个最大值的位置)
    start = np.argmax(arr)
    # 从start位置开始,找第一个False的索引
    first_false_after_start = start + np.argmax(arr[start:] == False)
    # 如果从start开始全是True,修正为数组最后一个索引
    if arr[start:].all():
        end = len(arr) - 1
    else:
        end = first_false_after_start - 1
    return start, end

方法二:基于np.diff的边界检测

通过检测布尔值变化的边界来定位连续序列的终点:

import numpy as np

def get_first_true_range(arr):
    start = np.argmax(arr)
    # 将布尔数组转为int后计算差分,-1表示从True变为False
    boundaries = np.diff(arr.astype(int))
    # 查找start之后第一个边界为-1的位置
    end_indices = np.where(boundaries[start:] == -1)[0]
    if len(end_indices) == 0:
        end = len(arr) - 1
    else:
        end = start + end_indices[0]
    return start, end

测试验证

将上述函数应用到示例数组中,均可得到预期结果:

# 测试示例1
a1 = np.array([False, True, True, True, False, True, True, False])
print(get_first_true_range(a1))  # 输出 (1, 3)

# 测试示例2
a2 = np.array([False, True, True])
print(get_first_true_range(a2))  # 输出 (1, 2)

# 测试示例3
a3 = np.array([True, True, True, False, True, True, False])
print(get_first_true_range(a3))  # 输出 (0, 2)

# 测试示例4
a4 = np.array([False, True, True, True])
print(get_first_true_range(a4))  # 输出 (1, 3)

# 测试示例5
a5 = np.array([False, True, False, True])
print(get_first_true_range(a5))  # 输出 (1, 1)

内容的提问来源于stack exchange,提问作者Salvatore Daniele Bianco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:27:49