如何高效实现不同长度一维numpy数组从指定索引位置开始相加
高效实现numpy数组指定位置相加方案
核心思路是用numpy原生的切片+矢量运算,所有计算都在底层C层面执行,没有Python层的循环开销,性能远高于手写for循环,完全满足高频调用的需求。
实现代码(原地修改原数组)
如果你可以接受直接修改原数组b,用以下写法即可,内存开销最低:
import numpy as np def add_arrays(b: np.ndarray, a: np.ndarray, i: int) -> np.ndarray: # 可选添加边界校验,避免索引越界 assert i >= 0 and i + len(a) <= len(b), "起始索引超出数组b的合法范围" b[i:i+len(a)] += a return b
测试示例(和题目要求一致)
a = np.array([5, 10, 15]) b = np.array([0, 0, 10, 10, 10, 0, 0]) res = add_arrays(b, a, 2) print(res) # 输出:[ 0 0 15 20 25 0 0]
注:你给出的朴素实现实际是赋值操作,和示例的数组相加效果不符,以上实现按示例的相加逻辑编写,如果需要赋值效果,将代码中的
+=替换为=即可。
不修改原数组的实现
如果你需要保留原数组b不变,先拷贝再操作即可:
def add_arrays_no_modify(b: np.ndarray, a: np.ndarray, i: int) -> np.ndarray: assert i >= 0 and i + len(a) <= len(b), "起始索引超出数组b的合法范围" res = b.copy() res[i:i+len(a)] += a return res
性能优势
- 没有Python层循环的解释器开销,针对大数组场景,速度比手写for循环高几十到上百倍
- 原地操作版本不需要额外申请大块内存,内存利用率更高
内容的提问来源于stack exchange,提问作者Alligatooo
相关产品推荐
相关产品推荐

