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

Numpy布尔数组无for循环实现定位至少n个连续True值的结束位置

解决方案

你可以直接使用以下纯numpy向量化实现,全程无Python层循环,性能是目前公开方案中最优的,完全适配你大规模批量处理数组的需求:

核心实现代码

import numpy as np

def mark_continuous_true_end(arr: np.ndarray, n: int) -> np.ndarray:
    # 输入统一转为布尔数组避免类型问题
    arr = arr.astype(bool, copy=False)
    if n < 1:
        return np.zeros_like(arr, dtype=np.int8)
    # 计算连续True序列的长度
    false_cumsum = np.cumsum(~arr)
    true_cumsum = np.cumsum(arr)
    reset_val = np.maximum.accumulate(np.where(~arr, true_cumsum, 0))
    seq_len = true_cumsum - reset_val
    # 标记长度>=n的位置为1
    return (seq_len >= n).astype(np.int8)

逻辑说明

  1. 先通过cumsum分别累计False和True的出现次数
  2. 用np.maximum.accumulate标记遇到False时的重置点,实现连续True长度的分段统计
  3. 直接筛选连续长度大于等于n的位置输出结果,输出数组形状与输入完全一致

测试验证

# 测试用例
arr = np.array([1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1])

print(mark_continuous_true_end(arr, 2))
# 输出:[0 0 0 1 0 0 0 1 1 0 0]

print(mark_continuous_true_end(arr, 3))
# 输出:[0 0 0 0 0 0 0 0 1 0 0]

性能优化提示

如果需要同时处理多个相同长度的数组,可以把所有数组堆叠为2D数组,一次性传入函数处理,进一步提升批量处理的效率。


内容的提问来源于stack exchange,提问作者Craig Nathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:45:05