[Numpy-discussion] subclassing ndarray subtleties??

Dan Goodman dg.gmane at thesamovar.net
Tue May 22 16:07:10 EDT 2012

On 22/05/2012 18:20, Nathaniel Smith wrote:
> I don't know of anything that the docs are lacking in particular. It's
> just that subclassing in general is basically a special form of
> monkey-patching: you have this ecosystem of cooperating methods, and
> then you're inserting some arbitrary changes in the middle of it.
> Making it all work in general requires that you carefully think
> through how all the different pieces of the ndarray API interact, and
> the ndarray API is very large and complicated. The __getslice__ thing
> is one example of this. For another: does your __getitem__ properly
> handle *all* the cases that regular ndarray.__getitem__ handles? (I'm
> not sure anyone actually knows what this complete list is, there are a
> lot of potential corner cases.) What happens if one of your objects is
> passed to third-party code that uses __getitem__? What happens if your
> array is accidentally stripped of its magic properties by passing
> through np.asarray() at the top of some function? Have you thought
> about how your special attributes are affected by, say, swapaxes? Have
> you applied your tweaks to item() and setitem()?
> I'm just guessing randomly here of course, since I have no idea what
> you've done. And I've subclassed ndarray myself at least three times,
> for reasons that seemed good enough at the time, so I'm not saying
> it's never doable. It's just that there are tons of these tiny little
> details, any one of which can trip you up, and that means that people
> tend to dive in and then discover the pitfalls later.

I've also used subclasses of ndarray, and have stumbled across most (but 
not all) of the problems you mentioned above. In my case, my code has 
gradually evolved over a few years as I've become aware of each of these 
problems. I think it would be useful to have an example of a completely 
'correctly' subclassed ndarray that handles all of these issues that 
people could use as a template when they want to subclass ndarray. I 
appreciate, though, that there's no-one who particularly wants to do 
this! :) I'd offer my code as an example, but Nathaniel's comment above 
shows that there's many things mine doesn't handle properly.


More information about the NumPy-Discussion mailing list