[Numpy-discussion] very simple iteration question.

Anne Archibald peridot.faceted@gmail....
Wed Apr 30 03:33:49 CDT 2008


2008/4/30 a g <lmnop345@gmail.com>:
> Hi.  This is a very basic question, sorry if it's irritating.  If i
>  didn't find the answer written already somewhere on the site, please
>  point me to it.  That'd be great.
>
>  OK: how do i iterate over an axis other than 0?
>
>  I have a 3D array of data[year, week, location].  I want to iterate
>  over each year at each location and run a series of stats on the
>  columns (on the 52 weeks in a particular year at a particular location).
>   'for years in data:' will get the first one, but then how do i not
>  iterate over the 1 axis and iterate over the 2 axis instead?

Well, there's always

for i in xrange(A.shape[1]):
    do_something(A[:,i,...])

But that's kind of ugly in this day and age. I would be tempted by

for a in np.rollaxis(A,1):
    do_something(a)

It's worth mentioning that traversing an array along an axis not the
first usually results in subarrays that are not contiguous in memory.
While numpy makes working with these convenient, they may not be very
efficient for cache reasons (for example, modern processors load from
memory - an extremely slow operation - in blocks that may be as large
as 64 bytes; if you only use eight of these before moving on, your
code will use much more memory bandwidth than it needs to). If this is
a concern, you can usually transparently rearrange your array's memory
layout to avoid it.

Anne


More information about the Numpy-discussion mailing list