[Numpy-discussion] Numpy unexpected (for me) behaviour
V. Armando Sole
sole at esrf.fr
Fri Jan 23 03:10:41 EST 2009
At 01:44 23/01/2009 -0600, Robert Kern wrote:
>It is an inevitable consequence of several features interacting
>together. Basically, Python expands "a[b] += 1" into this:
>
> c = a[b]
> d = c.__iadd__(1)
> a[b] = d
>
>Basically, the array c doesn't know that it was created by indexing a,
>so it can't do the accumulation you want.
Well inevitable would not be the word I would use. I would have expected a
different behaviour between a[b] = a[b] + 1 and a[b] += 1
In the second case python (or numpy) does not need to generate an
intermediate array and could be doing in-place operations.
> > Is there a way I can achieve the first result
> > without a for loop? In my application the difference is a factor 10 in
> > execution time (1000 secons instead of 100 ...)
>
>In [6]: bincount?
>Type: builtin_function_or_method
>Base Class: <type 'builtin_function_or_method'>
>String Form: <built-in function bincount>
>Namespace: Interactive
>Docstring:
> bincount(x,weights=None)
>
> Return the number of occurrences of each value in x.
>
> x must be a list of non-negative integers. The output, b[i],
> represents the number of times that i is found in x. If weights
> is specified, every occurrence of i at a position p contributes
> weights[p] instead of 1.
>
> See also: histogram, digitize, unique.
Indeed what I am doing is very close to histogramming.
Unfortunaly what I have to add is not just one but a value. I have a set of
scattered points (x,y,z) and values corresponding to those points. My goal
is to get a regular grid in which in each voxel I sum the values of the
points falling in them. I guess I will have to write a tiny C extension. I
had expected the += sintax would trigger the in-place operation.
Best regards,
Armando
More information about the NumPy-Discussion
mailing list