# can this be made faster?

Andreas Eisele eisele at dfki.de
Wed Oct 25 03:53:49 CDT 2006

```Recently, there were several requests and discussions on this list about
how to
increment an array a  in cells pointed to from a second integer array b
(optionally by
values from a third array c), such as:

>  Yes, that'd be
>     a[b] += c
>
>  On 10/8/06, Daniel Mahler <dmahler at gm...> wrote:
>  > Is there a 'loop free' way to do this in Numeric
>  >
>  > for i in arange(l):
>  >    a[b[i]]+=c[i]
>  >
>  > where l == len(b) == len(c)
>  >
>  > thanks
>  > Daniel
>
>
or
> It is clear to me that the numpy += operator in combination with the use
>  of arrays of indexes, as is explained in the Tentative Numpy Tutorial
>
>
>  the limitation being that indexes that appear more than 1 time in the
>  indexes-array will get incremented only once.
>
>  Does anybody know a way to work around this?
>
>  I am using this to fill up a custom nd-histogram, and obviously each bin
>  should be able to get incremented more than once. Looping over the
>  entire array and incrementing each bin succesively takes waaay to long
>  (these are pretty large arrays, like 4000x2000 items, or even larger)
I just came across a function that seems to provide the solution to both
requests,
which is called bincount.

The first usecase could be written as

a += bincount(b,c)

(assuming a has already the right dimension, otherwise a = bincount(b,c)
would create an
array with the minimal required size), the second case is even simpler:

counts = bincount(index)

On my machine, this does 20M counting operations per second, which is _much_
faster than anything that could be done in an explicit for loop.

Hope this helps,

Andreas

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier