[Pyrex] [Cython] access to numpy functions?

Dag Sverre Seljebotn dagss at student.matnat.uio.no
Thu May 1 16:39:44 CEST 2008


> API?  If I have two objects in Cython/Pyrex, like:
>
>
> c_numpy.ndarray x,y
>
> and I want to do a dot product, or add the two arrays, is there  
> access to the numpy C-version of this?  I know I could write my own  
> for the dot product, but I'd rather not reinvent the wheel when  
> possible.
>   

First off, you can use the Python functions directly, like this (Cython 
syntax):

---
import numpy
cimport c_numpy

cdef c_numpy.ndarray a = ..., b = ...
cdef c_numpy.ndarray c = numpy.dot(a, b)
---

As for calling the NumPy C functions directly: The a place to start is 
looking seems to be core/src/multiarraymodule.c. (You may want to ask in 
the numpy mailing list as well though. I'm not very familiar with NumPy 
internals.)

My first impression is that the implementations (say, 
PyArray_InnerProduct for instance) seem to be a) very generic (any 
number of dimensions/strides etc. and b) coded using the Python/C API 
directly, so there is no "inner layer" to communicate with. I.e., 
arguments to functions are Python objects.

So you're probably just as well off by calling the functions through the 
Python API like stated above.

If that is not fast enough, there doesn't seem to be much to be gained 
by "direct calls" to the C functions; and a new implementation in Cython 
seems in order. The main reason is that to make this faster you will 
want to make use of additional information -- if you know the number of 
dimensions (or even their size) and datatype at compile-time, you can 
make some optimizations that functions in the NumPy library will never 
be able to do. (For most if not all cases I'm guessing that we're 
talking very small gains if any gains here; though if you tend to 
multiply really small arrays a lot (like doing coordinate 
transformation...) then I suppose you must write your own code.)

-- 
Dag Sverre




More information about the Pyrex mailing list