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