[Numpy-discussion] subclassing ndaray

Travis Oliphant oliphant.travis at ieee.org
Fri Feb 24 17:41:14 EST 2006

Stefan van der Walt wrote:

>I see the same strange result.  Here is a minimal code example to
>import numpy as N
>class Bar(N.ndarray):
>    v = 0.
>    def __new__(cls, *args, **kwargs):
>	print "running new"
>	return super(Bar, cls).__new__(cls, *args)
>    def __init__(self, *args, **kwargs):
>	print "running init"
>	self[:] = 0
>	self.v = 3
It's only strange if you have assumptions your not revealing.  Here's 
the deal.

Neither the __init__ method nor the __new__ method are called for c = b+1.

So, your wondering how the Bar object got created then right?  Well, it 
got created as a subclass of ndarray in PyArray_NewFromDescr. 

The __init__ and __new__ methods are not called because they may have 
arbitrary signatures.  Instead,  the __array_finalize__ method is always 
called.  So, you should use that instead of __init__.

The __array_finalize__ method always receives the argument of the 
"parent" object.

Thus in your case.

       def __array_finalize__(self, parent):
             self.v = 3

would do what you want.


>In [88]: b = Bar(3)
>running new
>running init
>In [89]: b
>Out[89]: Bar([0, 0, 0])
>In [90]: b.v
>Out[90]: 3
>In [91]: c = b+1
>In [92]: c.v
>Out[92]: 0.0
>However, if I do b[:] = 1, everything works fine.
>On Fri, Feb 24, 2006 at 10:56:02AM -0500, Colin J. Williams wrote:
>>I have a subclass Bar, a 1-dim array which has some methods and some 
>>attributes.  One of the attributes is a view of the Bar to permit 
>>different shaping.
>>Suppose that 'a' is an instance of 'Bar', which has a method 'show' and 
>>a view attribute 'v'. 
>>a ^ 15 returns a Bar instance, with its methods but without the attributes.
>>I am attempt to change this, Bar has a method __xor__, see below:
>>     def __xor__(self, other):
>>       ''' Exclusive or: __xor__(x, y) => x ^ y . '''
>>       z=
>>   1                                                                    
>>   <<  this loops to the recursion limit
>>       result= ArrayType.__xor__(self, other)
>>       n= self.n
>>       result.n= n
>>       result.rowSize= self.rowSize
>>       result.show= self.show
>>       result.v= _n.reshape(result.view(), (n*n, n*n))
>>       return result
>>Could anyone suggest a workaround please?
>>Colin W.
>This SF.Net email is sponsored by xPML, a groundbreaking scripting language
>that extends applications into web and mobile media. Attend the live webcast
>and join the prime developer group breaking into this new coding territory!
>Numpy-discussion mailing list
>Numpy-discussion at lists.sourceforge.net

More information about the NumPy-Discussion mailing list