|
From: Arnd B. <arn...@we...> - 2005-10-12 13:04:16
|
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 ###################################### |