[Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Tony Ladd
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

-- 
Tony Ladd

Chemical Engineering Department
University of Florida
Gainesville, Florida 32611-6005
USA

Email: tladd-(AT)-che.ufl.edu
Webhttp://ladd.che.ufl.edu

Tel:   (352)-392-6509
FAX:   (352)-392-9514

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Benjamin Root
On Tue, Feb 19, 2013 at 10:00 AM, Tony Ladd tl...@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
___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Sebastian Berg
On Tue, 2013-02-19 at 10:00 -0500, Tony Ladd 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.
 

You might be interested in this:
https://github.com/numpy/numpy/pull/2821

But anyway, you should however be able to do what you want to do using
np.bincount with the weights keyword argument.

Regards,

Sebastian

 Would much appreciate any help - probably a really simple question.
 
 Thanks
 
 Tony
 


___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Alan G Isaac
x=[1,2,3,4,5,6]
ind=[1,3,9,3,4,1]
f=np.zeros(10)
np.bincount(ind,x)

hth,
Alan Isaac

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Tony Ladd
Alan

Thanks - I felt sure there had to be an easy idea.

Best

Tony

On 02/19/2013 10:17 AM, Alan G Isaac wrote:
 x=[1,2,3,4,5,6]
 ind=[1,3,9,3,4,1]
 f=np.zeros(10)
 np.bincount(ind,x)

 hth,
 Alan Isaac

 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

-- 
Tony Ladd

Chemical Engineering Department
University of Florida
Gainesville, Florida 32611-6005
USA

Email: tladd-(AT)-che.ufl.edu
Webhttp://ladd.che.ufl.edu

Tel:   (352)-392-6509
FAX:   (352)-392-9514



___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Tony Ladd
Thanks to all for a very quick response. np.bincount does what I need.

Tony

On 02/19/2013 10:04 AM, Benjamin Root wrote:


 On Tue, Feb 19, 2013 at 10:00 AM, Tony Ladd tl...@che.ufl.edu 
 mailto:tl...@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



 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

-- 
Tony Ladd

Chemical Engineering Department
University of Florida
Gainesville, Florida 32611-6005
USA

Email: tladd-(AT)-che.ufl.edu
Webhttp://ladd.che.ufl.edu

Tel:   (352)-392-6509
FAX:   (352)-392-9514



___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion


Re: [Numpy-discussion] Array accumulation in numpy

2013-02-19 Thread Eraldo Pomponi
Dear Tony,

I would suggest to look at this post already mentioned by Benjamin .
maybe it fits with your needs!
http://numpy-discussion.10968.n7.nabble.com/Pre-allocate-array-td4870.html

Cheers,
Eraldo



On Tue, Feb 19, 2013 at 4:24 PM, Tony Ladd tl...@che.ufl.edu wrote:

 Thanks to all for a very quick response. np.bincount does what I need.

 Tony

 On 02/19/2013 10:04 AM, Benjamin Root wrote:
 
 
  On Tue, Feb 19, 2013 at 10:00 AM, Tony Ladd tl...@che.ufl.edu
  mailto:tl...@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
 
 
 
  ___
  NumPy-Discussion mailing list
  NumPy-Discussion@scipy.org
  http://mail.scipy.org/mailman/listinfo/numpy-discussion

 --
 Tony Ladd

 Chemical Engineering Department
 University of Florida
 Gainesville, Florida 32611-6005
 USA

 Email: tladd-(AT)-che.ufl.edu
 Webhttp://ladd.che.ufl.edu

 Tel:   (352)-392-6509
 FAX:   (352)-392-9514



 ___
 NumPy-Discussion mailing list
 NumPy-Discussion@scipy.org
 http://mail.scipy.org/mailman/listinfo/numpy-discussion

___
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion