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

如何高效实现按索引数组将值数组对应元素累加至目标数组?

如何高效实现按索引数组将值数组对应元素累加至目标数组?

嘿,这个场景我太有体会了!Python循环处理大数据量的时候简直是灾难,尤其是你说的百万级数据对,那速度慢到让人抓狂。好在numpy给我们提供了专门的工具,完全不用手动写循环就能搞定,性能直接拉满~

首先给你上最直接的解决方案:用np.add.at函数,它就是专门为这种按重复索引原地累加的场景设计的,底层是C实现的,完全避开了Python循环的开销。代码写起来超简单:

import numpy as np
values = np.array([1,2,3,4,5])
indices = np.array([0,2,2,3,0])
target = np.zeros((4))

# 核心就这一行
np.add.at(target, indices, values)
print(target)  # 输出就是你要的array([6., 0., 5., 4.])

为什么这个比循环快?因为Python的for循环每一次迭代都要做类型检查、上下文切换这些额外操作,而numpy的内置函数是直接在底层对数组内存做操作,百万级的数据对处理起来也是毫秒级的事儿。

另外还有个备选方案:np.bincount,这个函数可以直接统计每个索引对应的权重总和,用它也能实现需求,代码更简洁:

result = np.bincount(indices, weights=values, minlength=len(target))
print(result)  # 同样得到array([6., 0., 5., 4.])

这里要注意两者的区别:

  • 如果你的target数组本来就有初始值(不是全零),np.add.at可以直接在原数组上累加,非常方便
  • 而np.bincount是生成一个新数组,如果要和原target结合,得写成target += np.bincount(indices, weights=values, minlength=len(target))

最后给你总结下怎么选:

  • 原地修改已有目标数组 → 用np.add.at
  • 直接生成新的结果数组 → 用np.bincount,性能同样优秀

备注:内容来源于stack exchange,提问作者calquigs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:04:29