[Numpy-discussion] how to tally the values seen

Peter Shinners pete at shinners.org
Wed Apr 14 03:05:09 EDT 2010


On 04/13/2010 11:44 PM, Gökhan Sever wrote:
>
>
> On Wed, Apr 14, 2010 at 1:34 AM, Warren Weckesser 
> <warren.weckesser at enthought.com 
> <mailto:warren.weckesser at enthought.com>> wrote:
>
>     Gökhan Sever wrote:
>     >
>     >
>     > On Wed, Apr 14, 2010 at 1:10 AM, Peter Shinners
>     <pete at shinners.org <mailto:pete at shinners.org>
>     > <mailto:pete at shinners.org <mailto:pete at shinners.org>>> wrote:
>     >
>     >     I have an array that represents the number of times a value
>     has been
>     >     given. I'm trying to find a direct numpy way to add into
>     these sums
>     >     without requiring a Python loop.
>     >
>     >     For example, say there are 10 possible values. I start with an
>     >     array of
>     >     zeros.
>     >
>     > >>> counts = numpy.zeros(10, numpy.int <http://numpy.int>
>     <http://numpy.int>)
>     >
>     >     Now I get an array with several values in them, I want to
>     add into
>     >     counts. All I can think of is a for loop that will give my the
>     >     results I
>     >     want.
>     >
>     >
>     > >>> values = numpy.array((2, 8, 1))
>     > >>> for v in values:
>     >     ...    counts[v] += 1
>     > >>> print counts
>     >     [0 1 1 0 0 0 0 0 1 0]
>     >
>     >
>     > This is easy:
>     >
>     > I[3]: a
>     > O[3]: array([ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.])
>     >
>     > I[4]: a = np.zeros(10)
>     >
>     > I[5]: b = np.array((2,8,1))
>     >
>     > I[6]: a[b] = 1
>     >
>     > I[7]: a
>     > O[7]: array([ 0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.])
>     >
>     > Let me think about the other case :)
>     >
>     >
>     >     I also need to handle the case where a value is listed more
>     than once.
>     >     So if values is (2, 8, 1, 2) then count[2] would equal 2.
>     >
>
>
>     numpy.bincount():
>
>
>     In [1]: import numpy as np
>
>     In [2]: x = np.array([2,8,1,2,7,7,2,7,0,2])
>
>     In [3]: np.bincount(x)
>     Out[3]: array([1, 1, 4, 0, 0, 0, 0, 3, 1])
>
>
>
> I knew a function exists in numpy for this case too :)
>
> This is also safer way to handle the given situation to prevent index 
> out of bounds errors.

Thanks guys. Numpy always surprises me. It's like you guys have borrowed 
Guido's time machine.
This is running far faster than I ever hoped.

My next problem involves a bit of indexing and reordering. But I'm gonna 
spend a night of my own time to see where I can get with it.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20100414/accca0fd/attachment.html>


More information about the NumPy-Discussion mailing list