[Numpy-discussion] Subclassing ndarray in Pyrex

Pierre GM pgmdevlist at gmail.com
Wed Jan 31 07:15:05 EST 2007

I'm still trying to subclass ndarray in Pyrex, without much success so far.

I started to follow Francesc's suggestion 
but that doesn't fit what I need: the myarray class Francesc introduced is 
just an object, not a subclass of ndarray...

The closest I came to something vaguely running is the following (called 
subnd.pyx later on):
from definitions cimport import_array, \
     malloc, free, npy_intp, \
     PyArray_GETITEM, PyArray_EMPTY, \
     ndarray, dtype

# NumPy must be initialized

import numpy as _N
cdef class Sub_2(ndarray):
    cdef readonly object _info
    cdef ndarray __mask
    def __new__(self, object shape=None, object dtype=None, object 
                object order=None, object infodict={}):
        self.__mask = <ndarray>_N.zeros(shape, _N.bool)
        self._info = infodict
    property info:
        def __get__(self):
            return self._info
        def __set__(self, value):
            self._info = value
    property _mask:
        def __get__(self):
            return self.__mask

def subarray(obj, info={}):
    _obj = <ndarray>_N.asarray(obj)
    print "_obj is: %s" % _obj
    _internal = Sub_2(shape=_obj.shape, dtype=_obj.dtype)
    _internal.flat[:] = _obj.flat[:]
    _internal.info = info
    return _internal    
However, I get a segfault when I try to play with it in Python:
>>> import numpy as N
>>> import subnd
>>> L = N.array([1,2,3]
>>> x = subarray(L)
>>> x
Sub_2([1, 2, 3])
>>> x+1
Sub_2([2, 3, 4])
>>> N.log(x)
So obviously I'm missing something, but what ? Some kind of closure ?

Moreover, I'm a bit disappointed with this method: if I understand correctly 
the subtleties of subclassing in pyrex, the ndarray.__new__ is called before 
Sub_2.__new__, with the same arguments. As ndarray.__new__  doesn't take 
optional arguments, the subclass can't either. That's a bit limiting, I have 
to call the constructor function all the time...

I'm completely at loss, here. Any advice/help/suggestions would be more than 

More information about the NumPy-Discussion mailing list