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

如何用NumPy高效将布尔数组中每个True的前n个元素设为True?

问题描述

给定NumPy布尔数组:

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

要求:对数组中每个True值,将其前n个元素(示例中n=2)设为True。已尝试循环实现,但希望找到更高效的方法。

期望输出:

array([False, True, True,  True,  True, True,  True, True, True,
        True, False, False, False, True, True,  True])

思路方向:想获取所有True值前2个元素的掩码,再与原数组执行np.logical_or操作,但无法正确生成掩码,寻求帮助。

高效实现方案

可以利用NumPy的索引和广播特性快速生成目标掩码,无需循环,步骤如下:

  1. 获取所有True值的索引

    true_indices = np.where(x)[0]
    

    执行后得到原数组中所有True的位置:array([3,4,6,9,15])

  2. 生成需要置为True的扩展索引
    对每个True的索引,生成它前n个位置的索引(过滤掉小于0的索引避免越界):

    n = 2
    # 用广播生成每个True索引对应的前n个索引
    extended_indices = true_indices[:, None] - np.arange(1, n+1)
    # 保留有效索引(≥0)
    extended_indices = extended_indices[extended_indices >= 0]
    

    得到的extended_indices为array([1,2,2,3,4,5,7,8,13,14]),即所有需要被置为True的前n个位置。

  3. 生成掩码并合并原数组
    创建全False掩码,将扩展索引位置设为True,再与原数组做逻辑或操作:

    mask = np.zeros_like(x)
    mask[extended_indices] = True
    result = np.logical_or(x, mask)
    

运行上述代码即可得到期望的输出。该方法基于NumPy向量操作,比循环高效得多,尤其适合处理大规模数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:15:37