[Numpy-discussion] Vectorizing array updates

Dan Goodman dg.gmane@thesamovar....
Wed Apr 29 17:09:27 CDT 2009


Robert Kern wrote:
> On Wed, Apr 29, 2009 at 16:19, Dan Goodman <dg.gmane@thesamovar.net> wrote:
>> Robert Kern wrote:
>>> On Wed, Apr 29, 2009 at 08:03, Daniel Yarlett <daniel.yarlett@gmail.com> wrote:
>>>
>>>> As you can see, Current is different in the two cases. Any ideas how I
>>>> can recreate the behavior of the iterative process in a more numpy-
>>>> friendly, vectorized (and hopefully quicker) way?
>>> Use bincount().
>> Neat. Is there a memory efficient way of doing it if the indices are
>> very large but there aren't many of them? e.g. if the indices were
>> I=[10000, 20000] then bincount would create a gigantic array of 20000
>> elements for just two addition operations!
> 
> indices -= indices.min()
> 

Ah OK, but bincount is still going to make an array of 10000 elements in 
that case...

I came up with this trick, but I wonder whether it's overkill:

Supposing you want to do y+=x[I] where x is big and indices in I are 
large but sparse (although potentially including repeats).

J=unique(I)
K=digitize(I,J)-1
b=bincount(K)
y+=b*x[J]

Well it seems to work, but surely there must be a nicer way?

Dan



More information about the Numpy-discussion mailing list