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

如何使用numpy基于索引将数组元素累加到指定大小的零数组

解决按索引累加numpy数组的问题

这事儿用numpy处理超简单,给你两种高效的原生方法,完全不用写循环,速度拉满:

方法一:使用np.add.at()(原地累加)

这种方法专门针对重复索引需要累加的场景——numpy常规的索引赋值(比如arr2[arg_arr] += arr1)会因为广播机制只保留最后一次赋值,而np.add.at()会对每个索引位置执行原地累加操作,完美匹配你的需求。

代码示例:

import numpy as np

# 定义原始数组和索引数组
arr1 = np.array([ 0., 329., 730., 513., 0., 167., 0., 0., 175., 0., 220., 0., 0., 0., 202., 0., 0., 59., 0., 33., 47.])
arg_arr = np.array([4, 3, 2, 3, 1, 3, 2, 0, 3, 0, 3, 2, 2, 1, 0, 4, 4, 3, 2, 0, 3], dtype=np.int64)

# 初始化结果数组
arr2 = np.zeros((5,))

# 按索引执行累加
np.add.at(arr2, arg_arr, arr1)

print(arr2)
# 输出结果:array([235., 167., 1460., 1510., 0.])

方法二:使用np.bincount()(一步到位)

np.bincount()原本是用来统计非负整数数组中每个值的出现次数,但加上weights参数后,它会直接计算每个索引对应的权重总和,正好就是我们需要的累加结果。因为你的索引数组arg_arr最大值是4,所以结果正好是长度为5的数组,完全符合要求。

代码示例:

import numpy as np

arr1 = np.array([ 0., 329., 730., 513., 0., 167., 0., 0., 175., 0., 220., 0., 0., 0., 202., 0., 0., 59., 0., 33., 47.])
arg_arr = np.array([4, 3, 2, 3, 1, 3, 2, 0, 3, 0, 3, 2, 2, 1, 0, 4, 4, 3, 2, 0, 3], dtype=np.int64)

# 直接计算累加结果
arr2 = np.bincount(arg_arr, weights=arr1)

print(arr2)
# 输出结果和上面完全一致:array([235., 167., 1460., 1510., 0.])

结果验证

咱们手动核对几个关键位置:

  • 索引0:对应arr1中arg_arr=0的元素是0.(索引7)、0.(索引9)、202.(索引14)、33.(索引19),累加和为0+0+202+33=235.,和输出一致。
  • 索引3:对应元素累加和为329+513+167+175+220+59+47=1510.,完全正确。

两种方法都能高效解决问题,np.bincount()更简洁,np.add.at()则适合需要保留arr2自定义初始值(比如初始不是全0)的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:17:46