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)
逻辑说明
- 先通过
cumsum分别累计False和True的出现次数 - 用
np.maximum.accumulate标记遇到False时的重置点,实现连续True长度的分段统计 - 直接筛选连续长度大于等于
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
相关产品推荐
相关产品推荐

