Dnia piÄ…tek, 21 listopada 2014 00:09:51 Nathaniel Smith pisze:
On Thu, Nov 20, 2014 at 5:47 PM, Marek Wojciechowski
wrote: Hi!
I wrote a simple subclass of np.ndarray and now i do call np.sum() on it. I expected that the result will be a python float (or int) just like when summing up regular arrays. Instead i obtain the (scalar) view of my subclass. How can i change this behavior? I tried writing __array_wrap__ method like this:> def __array_wrap__(self, out_arr, context=None): selfv = self.view(np.ndarray) return np.ndarray.__array_wrap__(selfv, out_arr, context)
but this just returns np.ndarray type and not float.
There isn't really any reason to call __array_wrap__ here. Just compute whatever value you want and return it. If you want a float then return that :-). (Something like if selfv.ndim == 0: return selfv[()] )
As a bit of advice, if you can possibly avoid subclassing ndarray, then you probably should. There are a lot of painful little quirks that you'll run into.
Thanks for the answer. I thought similar, but the 'context' argument confused me a bit. I do not know what for it is here. Thanks also for the (reasonable) advice. Subclassing was just the fastest way to implement what i wanted to do, because of all these methods being on place. However i do see now, that that was not necessarily the best choice... -- Marek Wojciechowski