[Numpy-discussion] Please help with subclassing numpy.ndarray

Jeremy Conlin jeremit0 at gmail.com
Mon Feb 5 13:13:50 EST 2007


On 2/5/07, Pierre GM <pgmdevlist at gmail.com> wrote:
> On Monday 05 February 2007 11:32:22 Jeremy Conlin wrote:
> > Thanks for clarifying that.  I didn't understand what the
> > __array_finalize__ did.
>
> That means I should clarify some points on the wiki, then.
> A good exercise is to put some temporary comments in your code in __new__ and
> __array_finalize__, to show when these methods are called and how (that's how
> I learned)
>
> Thinking about it, the example you gave can't work. Your __new__ method
> returns H, viz, a pure ndarray. There won't be any call to __array_finalize__
> in that case, which is not what you want. Force the call by accessing a view
> of your array:
>
> class myhistog(N.ndarray):
>     def __new__(self, iniarray, inibin):
>         (H,edges) = N.histogramdd(iniarray,inibin)
>         self._defedges = edges
>         return H.view(self)
>
> Now, you do return a 'myhistog' class, not a pure 'ndarray', and
> __array_finalize__ is called.
>
>     def __array_finalize__(self, obj):
>         print "__array_finalize__ got %s as %s" % (obj, type(obj))
>         if not hasattr(self, 'edges'):
>             self.edges = self._defedges
>         myhistog._defedges = None
>
> Note the last line: you reset the class default to None (if this is what you
> want). Otherwise, new 'myhistog' objects wil inherit the previous edges.


Excellent now it does what I want!  But it raises more questions.
What exactly is a "view" of H?

Thanks again,
Jeremy



More information about the NumPy-Discussion mailing list