# [Numpy-discussion] Can you enumerarte an array?

Arnd Baecker arnd.baecker at web.de
Wed Oct 12 06:06:45 EDT 2005

```Hi Chris,

On Mon, 10 Oct 2005, Chris Barker wrote:

> Travis Oliphant wrote:
> > All flavors of Numeric would return
> >
> > 0  a[0]
> > 1  a[1]
> > .
> > .
> > .
> > n-1  a[n-1]
> >
> > where n=a.shape[0]
> >
> > in response to index, item in enumerate(A):
>
> Right, as expected, and as Anrd pointed out, this is useful behaviour.
>
> > In scipy you could also get
> >
> > 0 a.flat[0]
> > 1 a.flat[1]
>
> I do like the new flat!
>
> > To do something like he wants, I think we would have to construct a
> > different iterator then enumerate.
>
> Exactly,. I didn't mean to imply that that's what the built-in enumerate
> should do.
>
> > It wouldn't be that hard using the
> > a.flat iterator (it's just a remapping of the 1-d index).
>
> Cool. then again, consider this a feature request, for a nd_enumerate,
> or whatever you want to call it.
>
> I'm sorry that implimenting something like this myself is way out my depth!

Below is one way to do it. BUT:
- it is the first iterator I ever wrote...
- it is not using yield, which might be better style -
Oh and indeed it does give nicer code (see example 1).
- it does not use a.flat.

(BTW: I found
http://heather.cs.ucdavis.edu/~matloff/Python/PyIterGen.pdf

Best,

Arnd

1) Short variant
----------------

from Numeric import *

def arr_enumerate(arr):
for indy in xrange(arr.shape[1]):
for indx in xrange(arr.shape[0]):
yield (indy,indx),arr[indy,indx]

if __name__=="__main__":
x=reshape(arange(25),(5,5))
print x

for ind,value in arr_enumerate(x):
print ind,value

2) Longer variant (just left in for historical reasons ...;-)
-------------------------------------------------------------

from Numeric import *

class arr_enumerate:
def __init__(self,arr):
self.Nx,self.Ny=arr.shape    # just assume 2D here
self.arr=arr
self.indx=0
self.indy=0

def next(self):
indx=self.indx
indy=self.indy

self.indx+=1
if self.indx==self.Nx:
self.indx=0
self.indy+=1

if self.indy==self.Ny and self.indx==1:
raise StopIteration

return (indy,indx),self.arr[indy,indx]

def __iter__(self):
return self

if __name__=="__main__":
x=reshape(arange(25),(5,5))
print x

for ind,value in arr_enumerate(x):
print ind,value
######################################

```