如何使用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
相关产品推荐
相关产品推荐

