[Numpy-discussion] Histograms via indirect index arrays

Travis Oliphant oliphant.travis at ieee.org
Fri Mar 17 01:00:02 EST 2006


Mads Ipsen wrote:
> Hey,
>
> First of all, thanks for the new release.
>
> Here's another question regarding something I cannot quite understand:
>
> Suppose you want to update bins for a histogram, you might think you
> could do something like:
>
>   g = zeros(4,Int)
>   x = array([0.2, 0.2])
>   idx = floor(x/0.1).astype(int)
>   g[idx] += 1
>
> Here idx becomes
>
>    array([2, 2])
>
> In this case, I would naively expect g to end up like
>
>   array([0, 0, 2, 0])                     (1)
>
> but instead you get
>
>   array([0, 0, 1, 0])                     (2)
>
> Is this intended? Just being plain novice-like naive, I would expect
> the slice operation g[idx] += 1 to do something like
>   
Yes, this is intended (sort of --- this particular example isn't the 
reason for the behavior though). 

The issue is that the code g[idx] +=1 is equivalent in Python to

g[idx] = g[idx] + 1

Then g[idx] returns array([0,0]) as it should.  This new copy of the 
array data then gets added to 1 resulting in array([1,1]).  This array 
is then set into element 2 of g twice just as if you had done

g[2] = 1
g[2] = 1

Then end effect is you get a 1 out of the result.

Perhaps a little counter to the way you were thinking of the problem, 
but very much how it must be due to the way Python translates the 
statement g[idx] += 1 in this case. 

There are, of course, other ways to do what you want to do. 

-Travis






More information about the NumPy-Discussion mailing list