On Wed, Jun 15, 2011 at 9:34 AM, Olivier Delalleau <[email protected]> wrote:
> I don't really understand this behavior either, but juste note that > according to > http://docs.scipy.org/doc/numpy/user/c-info.beyond-basics.html > "This attribute can also be defined by objects that are not sub-types of > the ndarray" > > -=- Olivier > > > 2011/6/15 Jonathan Taylor <[email protected]> > >> Hi, >> >> I would like to have objects that I can mix with ndarrays in >> arithmetic expressions but I need my object to have control of the >> operation even when it is on the right hand side of the equation. I >> realize from the documentation that the way to do this is to actually >> subclass ndarray but this is undesirable because I do not need all the >> heavy machinery of a ndarray and I do not want users to see all of the >> ndarray methods. Is there a way to somehow achieve these goals? >> >> I would also very much appreciate some clarification of what is >> happening in the following basic example: >> >> import numpy as np >> class Foo(object): >> # THE NEXT LINE IS COMMENTED >> # __array_priority__ = 0 >> def __add__(self, other): >> print 'Foo has control over', other >> return 1 >> def __radd__(self, other): >> print 'Foo has control over', other >> return 1 >> >> x = np.arange(3) >> f = Foo() >> >> print f + x >> print x + f >> >> yields >> >> Foo has control over [0 1 2] >> 1 >> Foo has control over 0 >> Foo has control over 1 >> Foo has control over 2 >> [1 1 1] >> >> I see that I have control from the left side as expected and I suspect >> that what is happening in the second case is that numpy is trying to >> "broadcast" my object onto the left side as if it was an object array? >> >> Now if I uncomment the line __array_priority__ = 0 I do seem to >> accomplish my goals (see below) but I am not sure why. I am >> surprised, given what I have read in the documentation, that >> __array_priority__ does anything in a non subclass of ndarray. >> Furthermore, I am even more surprised that it does anything when it is >> 0, which is the same as ndarray.__array_priority__ from what I >> understand. Any clarification of this would be greatly appreciated. >> >> There's a bit of code in the ufunc implementation that checks for the __array_priority__ attribute regardless of if the object subclasses ndarray, probably because someone once needed to solve the same problem you are having. The comment that goes with it is /* * FAIL with NotImplemented if the other object has * the __r<op>__ method and has __array_priority__ as * an attribute (signalling it can handle ndarray's) * and is not already an ndarray or a subtype of the same type. */ Chuck
_______________________________________________ NumPy-Discussion mailing list [email protected] http://mail.scipy.org/mailman/listinfo/numpy-discussion
