[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
helpful)
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
######################################
More information about the NumPy-Discussion
mailing list