Python 分配给数组,添加索引的多个副本

Python 分配给数组,添加索引的多个副本,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,所以我有这个数组,对吗 a=np.zeros(5) 我想在给定的索引处添加值,其中索引可以重复 e、 g 我希望它生成数组([0,1,5,0,0.]),但我得到的答案是数组([0,1,3,0,0.]) 我希望它能与多维数组和可广播索引以及所有这些一起工作。有什么想法吗?您需要使用它来绕过遇到的缓冲问题+=(值不会在重复索引中累积)。指定数组、索引以及要在这些索引处添加的值: >>> a = np.zeros(5) >>> np.add.at(a, [1, 2

所以我有这个数组,对吗

a=np.zeros(5)
我想在给定的索引处添加值,其中索引可以重复

e、 g

我希望它生成
数组([0,1,5,0,0.])
,但我得到的答案是
数组([0,1,3,0,0.])

我希望它能与多维数组和可广播索引以及所有这些一起工作。有什么想法吗?

您需要使用它来绕过遇到的缓冲问题
+=
(值不会在重复索引中累积)。指定数组、索引以及要在这些索引处添加的值:

>>> a = np.zeros(5)
>>> np.add.at(a, [1, 2, 2], [1, 2, 3])
>>> a
array([ 0.,  1.,  5.,  0.,  0.])
at的
也是其他UFUNC的一部分(乘法、除法等)。此方法也适用于多维数组。

您需要使用它来解决遇到的缓冲问题(值不会在重复索引中累积)。指定数组、索引以及要在这些索引处添加的值:

>>> a = np.zeros(5)
>>> np.add.at(a, [1, 2, 2], [1, 2, 3])
>>> a
array([ 0.,  1.,  5.,  0.,  0.])

at的
也是其他UFUNC的一部分(乘法、除法等)。此方法也适用于多维数组。

您正在执行的操作可以看作是装箱,更具体地说,您正在进行加权装箱,这些值是权重,索引是装箱。对于这样的装箱操作,您可以使用

下面是实现-

import numpy as np

a=np.zeros(5)        # initialize output array

idx  = [1, 2, 2]     # indices
vals = [1, 2, 3]     # values

a[:max(idx)+1] = np.bincount(idx,vals) # finally store the bincounts
运行时测试

下面是两组输入数据量的一些运行时测试,比较了建议的基于
bincount
的方法和
add.at
的方法,如下所示:

数据大小#1-

数据大小#2-


您正在执行的操作可以看作是装箱,更具体地说,您正在进行加权装箱,这些值是权重,索引是装箱。对于这样的装箱操作,您可以使用

下面是实现-

import numpy as np

a=np.zeros(5)        # initialize output array

idx  = [1, 2, 2]     # indices
vals = [1, 2, 3]     # values

a[:max(idx)+1] = np.bincount(idx,vals) # finally store the bincounts
运行时测试

下面是两组输入数据量的一些运行时测试,比较了建议的基于
bincount
的方法和
add.at
的方法,如下所示:

数据大小#1-

数据大小#2-

In [254]: a=np.zeros(10000)
     ...: idx = np.sort(np.random.randint(1,10000,(5000))).tolist()
     ...: vals = np.random.rand(5000).tolist()
     ...: 

In [255]: %timeit np.add.at(a, idx, vals)
1000 loops, best of 3: 597 µs per loop

In [256]: %timeit a[:max(idx)+1] = np.bincount(idx,vals)
1000 loops, best of 3: 404 µs per loop