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

如何利用范围索引数组高效修改NumPy一维数组的指定区间元素?

高效修改NumPy数组多个区间元素的方法

嘿,这个需求用NumPy的向量化操作就能轻松搞定,完全不用写低效的Python循环!咱们直接利用NumPy的索引技巧一次性处理所有区间:

核心思路

把idx里的每个[起始索引, 结束索引]区间转换成NumPy切片,然后用np.r_把这些切片拼接成一个完整的索引数组,最后直接给这些索引位置的元素赋值255即可。

完整代码示例

import numpy as np

# 先初始化你的数组(这里假设m=20, n=10,你可以换成自己的数值)
m, n = 20, 10
ar1 = np.zeros((m*n))
idx = np.array( [[1,10], [40,80], [100,110]] )

# 生成所有需要修改的索引:注意切片左闭右开,所以结束索引要+1
target_indices = np.r_[tuple(slice(start, end + 1) for start, end in idx)]

# 一次性赋值
ar1[target_indices] = 255

关键细节说明

  • 为什么要给结束索引+1? 因为NumPy的切片是左闭右开规则,slice(a, b)会包含索引a但不包含b,所以我们要把end加1,才能确保区间的最后一个元素(比如10、80、110)也被包含进去。
  • 为什么用np.r_? 它是NumPy提供的一个便捷工具,可以快速拼接切片、数组等,内部是向量化实现,比用Python循环生成每个区间的索引再拼接要高效得多,尤其是当数组规模很大的时候,性能差距会非常明显。

替代方案(同样高效)

如果你觉得np.r_有点陌生,也可以用np.concatenate结合np.arange来生成索引数组,效果是一样的:

target_indices = np.concatenate([np.arange(start, end + 1) for start, end in idx])
ar1[target_indices] = 255

不过np.r_的写法更简洁,推荐优先使用~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:58:11