[Pyrex] Subclassing Numeric arrays

David M. Cooke cookedm at physics.mcmaster.ca
Wed May 11 18:11:42 CEST 2005


khinsen at cea.fr writes:

> On May 9, 2005, at 11:46, George Sakkis wrote:
>
>> array and delegates all calls to it. Unfortunately this was a
>> bottleneck
>> for my real-time requirements, so I coded MyVector in Pyrex from
>> scratch
>> (I need only a small fraction of the whole Numeric functionality).
>> Although it's almost four time faster now, I have to convert
>> explicitly to
>> Numeric arrays whenever a real array is expected. This is inelegant
>> apart
>
> I did the same in the same situation - but it's not that much effort:
>
> cdef class vector:
>
>      cdef double xv, yv, zv
>
>      property array:
>          def __get__(self):
>              return Numeric.array([self.xv, self.yv, self.zv])
>
> That's three lines for the conversion, and since it's called rarely in
> my case, performance doesn't matter either.

If you make that a method named __array__, Numeric will call it
automatically when it wants an array:

cdef class vector:
    cdef double xv, y

    def __array__(self):
        return Numeric.array([self.xv, self.yv, self.zv])

If you use it as above (creating a list, looking up the array function
the Numeric module, etc.), it'd probably be faster to not provide it,
and let Numeric use the sequence protocol instead (this is a gut
feeling, and should be measured, of course). Using Numeric's C API
(PyArray_FromDims) to build the array inside of the __array__ method
would be the fastest.

Starting with 24.0, Numeric supports the array interface protocol
documented at http://numeric.scipy.org/array_interface.html . This is
the fastest way for larger arrays.

> BTW, I can confirm that Numeric arrays cannot be subclassed. The code
> was written for Python 1.4. Numarray provides subclassable arrays, but
> it has performance problems of its own for small arrays.
>
> BTW, my Pyrex class for vectors is part of the ScientificPython
> distribution:
> 	http://dirac.cnrs-orleans.fr/ScientificPython/

I've also got a Pyrex vector class at
http://arbutus.mcmaster.ca/dmc/software/vector3.html

It does 2- and 3-dimensional vectors, and it's fast.

-- 
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke                      http://arbutus.physics.mcmaster.ca/dmc/
|cookedm at physics.mcmaster.ca



More information about the Pyrex mailing list