Hi,
I've been spending some time with Cython in Scipy:
http://projects.scipy.org/scipy/browser/trunk/scipy/io/matlab
In general, it's been very enjoyable - a warm thank you to y'all for
making it so clear and so useful.
Here, I just wanted to check that I had understood the idioms right to
call the numpy C-API. I'm doing this for speed.
Imagine I have a string 'data', length 'n' bytes, and a numpy dtype
'dt', and I wanted to make a 1d array. In python that is:
arr = np.ndarray(shape=(n,), dtype=dt, buffer=data)
Am I right, that in Cython, this would be a function like the
following (that does work):
# start of make_array.pyx
from python cimport Py_INCREF
cdef extern from "Python.h":
ctypedef struct PyTypeObject:
pass
import numpy as np
cimport numpy as cnp
cdef extern from "numpy/arrayobject.h":
PyTypeObject PyArray_Type
object PyArray_NewFromDescr(PyTypeObject *subtype,
cnp.dtype newdtype,
int nd,
cnp.npy_intp* dims,
cnp.npy_intp* strides,
void* data,
int flags,
object parent)
cdef extern from "workaround.h":
void PyArray_Set_BASE(cnp.ndarray arr, object obj)
# NOTE: numpy MUST be initialized before any other code is executed.
cnp.import_array()
def make_1d_array(cnp.npy_intp size, object data, cnp.dtype dt):
cdef char *ptr
ptr = data
Py_INCREF(<object> dt)
Py_INCREF(<object> data)
narr = PyArray_NewFromDescr(&PyArray_Type,
dt,
1,
&size,
NULL,
<void *>ptr,
0,
<object>NULL)
PyArray_Set_BASE(narr, data)
return narr
# end of make_array.pyx
where 'workaround.h' (thanks to Dag Sverre) [1]:
#include <numpy/arrayobject.h>
#define PyArray_Set_BASE(arr, obj) PyArray_BASE(arr) = obj
Is that correct? In particular, I don't think I fully understand the
right idiom for using the numpy array type PyArray_Type. Did I
understand correctly that I have to Py_INCREF both the dtype and the
data? [2] [3]
Many thanks for any help.
Matthew
[1] http://codespeak.net/pipermail/cython-dev/2009-June/005979.html
[2] http://docs.scipy.org/doc/numpy/reference/c-api.array.html
[3] http://wiki.cython.org/tutorials/numpy#UsingtheNumpyCAPI
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev