[Numpy-discussion] Array accumulation in numpy

Benjamin Root ben.root at ou.edu
Tue Feb 19 10:04:18 EST 2013


On Tue, Feb 19, 2013 at 10:00 AM, Tony Ladd <tladd at che.ufl.edu> wrote:

> I want to accumulate elements of a vector (x) to an array (f) based on
> an index list (ind).
>
> For example:
>
> x=[1,2,3,4,5,6]
> ind=[1,3,9,3,4,1]
> f=np.zeros(10)
>
> What I want would be produced by the loop
>
> for i=range(6):
>      f[ind[i]]=f[ind[i]]+x[i]
>
> The answer is f=array([ 0.,  7.,  0.,  6.,  5.,  0.,  0.,  0.,  0., 3.])
>
> When I try to use implicit arguments
>
> f[ind]=f[ind]+x
>
> I get f=array([ 0.,  6.,  0.,  4.,  5.,  0.,  0.,  0.,  0.,  3.])
>
>
> So it takes the last value of x that is pointed to by ind and adds it to
> f, but its the wrong answer when there are repeats of the same entry in
> ind (e.g. 3 or 1)
>
> I realize my code is incorrect, but is there a way to make numpy
> accumulate without using loops? I would have thought so but I cannot
> find anything in the documentation.
>
> Would much appreciate any help - probably a really simple question.
>
> Thanks
>
> Tony
>
>
I believe you are looking for the equivalent of accumarray in Matlab?

Try this:

http://www.scipy.org/Cookbook/AccumarrayLike

It is a bit touchy about lists and 1-D numpy arrays, but it does the job.
Also, I think somebody posted an optimized version for simple sums recently
to this list.

Cheers!
Ben Root
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20130219/f5d78c7f/attachment.html>


More information about the NumPy-Discussion mailing list