Excellent, thank you - it solved the problem! /Mark
-----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Tim Hochberg Sent: 18. december 2006 14:06 To: Discussion of Numerical Python Subject: Re: [Numpy-discussion] Unexpected output usingnumpy.ndarray and__radd__ Mark Hoffmann wrote: > I appreciate the answer and the solution suggestion. I see that it is > possible to make a work around by subclassing from ndarray. Still, in the > "print a+c" statement, I don't understand why a.__add__(c) doesn't return > NotImplemented (because ndarray shouldn't recognize the Cyclehist class) and > directly call c.__radd__(a) implemented in my Cyclehist class. I tried the > exactly same programme using Python 2.4.1 and Scipy 0.3.2 (based on > numeric/numarray) and the result of the "print a+c" didn't get nested as I > expect. > > Regards, > Mark > I'm not sure what this is doing -- it looks kind of bizzare -- however, you can fix this case without resorting to subclassing to ndarray. Just toss an '__array_priority__ = 10' up at the top of the class definition and it will use your __methods__ in preference to the ndarrays. I don't have time to look into this further right now unfortunately. -tim > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Stefan van > der Walt > Sent: 18. december 2006 10:36 > To: Discussion of Numerical Python > Subject: Re: [Numpy-discussion] Unexpected output using numpy.ndarray > and__radd__ > > Hi Mark > > On Mon, Dec 18, 2006 at 08:30:20AM +0100, Mark Hoffmann wrote: > >> The following issue has puzzled me for a while. I want to add a >> numpy.ndarray and an instance of my own class. I define this >> operation by implementing the methods __add__ and __radd__. My programme >> (including output) looks like: >> >> #!/usr/local/bin/python >> >> import numpy >> >> class Cyclehist: >> def __init__(self,vals): >> self.valuearray = numpy.array(vals) >> >> def __str__(self): >> return 'Cyclehist object: valuearray = '+str(self.valuearray) >> >> def __add__(self,other): >> print "__add__ : ",self,other >> return self.valuearray + other >> >> def __radd__(self,other): >> print "__radd__ : ",self,other >> return other + self.valuearray >> >> c = Cyclehist([1.0,-21.2,3.2]) >> a = numpy.array([-1.0,2.2,-2.2]) >> print c + a >> print a + c >> > > In the first instance, c.__add__(a) is called, which works fine. In the > second, a.__add__(c) is executed, which is your problem, since you rather > want c.__radd__(a) to be executed. A documentation snippets: > > """For instance, to evaluate the expression x-y, where y is an instance of a > class that has an __rsub__() method, y.__rsub__(x) is called if x.__sub__(y) > returns NotImplemented. > > Note: If the right operand's type is a subclass of the left operand's type > and that subclass provides the reflected method for the operation, this > method will be called before the left operand's non-reflected method. This > behavior allows subclasses to override their ancestors' operations.""" > > Since a.__add__ does not return NotImplemented, c.__radd__ is not called > where you expect it to be. I am not sure why broadcasting takes place here, > maybe someone else on the list can elaborate. > > To solve your problem, you may want to look into subclassing ndarrays, as > described at http://www.scipy.org/Subclasses. > > Cheers > Stéfan > _______________________________________________ > Numpy-discussion mailing list > [email protected] > http://projects.scipy.org/mailman/listinfo/numpy-discussion > _______________________________________________ > Numpy-discussion mailing list > [email protected] > http://projects.scipy.org/mailman/listinfo/numpy-discussion > > > _______________________________________________ Numpy-discussion mailing list [email protected] http://projects.scipy.org/mailman/listinfo/numpy-discussion _______________________________________________ Numpy-discussion mailing list [email protected] http://projects.scipy.org/mailman/listinfo/numpy-discussion
