[Numpy-discussion] subclassing array in c

mark florisson markflorisson88@gmail....
Fri Mar 30 15:41:09 CDT 2012


On 30 March 2012 21:40, mark florisson <markflorisson88@gmail.com> wrote:
> On 30 March 2012 21:38, mark florisson <markflorisson88@gmail.com> wrote:
>> On 30 March 2012 19:53, Chris Barker <chris.barker@noaa.gov> wrote:
>>> On Fri, Mar 30, 2012 at 10:57 AM, mark florisson
>>> <markflorisson88@gmail.com> wrote:
>>>> Although the segfault was caused by a bug in NumPy, you should
>>>> probably also consider using Cython, which can make a lot of this pain
>>>> and boring stuff go away.
>>>
>>> Is there a good demo/sample somewhere of an ndarray subclass in Cython?
>>>
>>> Some quick googling turned up a number of people asking about it, but
>>> I didn't find (quickly) a wiki page or demo about it.
>>>
>>> -Chris
>>>
>>> --
>>>
>>> Christopher Barker, Ph.D.
>>> Oceanographer
>>>
>>> Emergency Response Division
>>> NOAA/NOS/OR&R            (206) 526-6959   voice
>>> 7600 Sand Point Way NE   (206) 526-6329   fax
>>> Seattle, WA  98115       (206) 526-6317   main reception
>>>
>>> Chris.Barker@noaa.gov
>>> _______________________________________________
>>> NumPy-Discussion mailing list
>>> NumPy-Discussion@scipy.org
>>> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>>
>> It's not common to do, I tried the following:
>>
>> cimport numpy
>>
>> cdef extern from "Python.h":
>>    ctypedef struct PyTypeObject:
>>        void *tp_alloc
>>
>>    object PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
>>
>> cdef myalloc(PyTypeObject *type, Py_ssize_t nitems):
>>    print "allocating"
>>    return PyType_GenericAlloc(type, nitems)
>>
>> cdef class MyClass(numpy.ndarray) :
>>    cdef int array[10000000]
>>
>> (<PyTypeObject *> MyClass).tp_alloc = <void *> myalloc # This works
>> around the NumPy bug
>> cdef MyClass obj = MyClass((10,))
>> obj.array[999999] = 20
>>
>> The array attribute is quite large here to cause a segfault if our
>> trick to replace the tp_alloc isn't working. It's kind of a hack, but
>> the only alternative is to use composition instead.
>
> (So remove the array attribute, it's just for demonstration :)

And you can also directly assign PyType_GenericAlloc instead of
writing your own (again, demonstration to see if it works).


More information about the NumPy-Discussion mailing list