[Numpy-discussion] Help with PyArrayObject and C Arrays.

Andrea Riciputi ariciputi at pito.com
Wed Nov 19 08:26:17 CST 2003

I've written some C code for number crunching that uses the following 
structure for simulating 2-dimensional arrays (i.e. matrices):

typedef struct {
   double **aa;
   int nrows;
   int ncols;
} Array2d;

In order to read these C arrays in Python+Numeric and vice versa, I've 
written some wrapping code, but I'm not so sure it's correct. In 
particular I'm concerned in memory leakage, I don't know if I've 
understood correctly how PyArray_FromDimsAndData works and if I've 
choose the best way to solve the problem. My code follows.

Thanks for help!

C --> Python

  static PyObject *Array2d_2_PyArrayObject(Array2d *input) {
     int ndims[2];
     PyArrayObject *result;

     if (!input) return NULL;

     ndims[0] = input->nrows;
     ndims[1] = input->ncols;
     result = (PyArrayObject *) PyArray_FromDimsAndData(2, ndims, 
PyArray_DOUBLE, (char *) input->aa[0]);


     return PyArray_Return(result);

Python --> C

   static Array2d *PyList_2_Array2d(PyObject *input) {
     Array2d *result;

     if (!PySequence_Check(input)) {
       PyErr_SetString(PyExc_TypeError,"Expected a sequence");
       return NULL;

     result = (Array2d *) malloc(sizeof(Array2d));

     if (PyArray_As2D((PyObject **) &input, (char ***) &(result->aa), 
&(result->nrows), &(result->ncols), PyArray_DOUBLE) != 0) {
       PyErr_SetString(PyExc_MemoryError,"No heap space for data");
       return NULL;

     return result;

Andrea Riciputi

"Science is like sex: sometimes something useful comes out,
   but that is not the reason we are doing it" -- (Richard Feynman)

More information about the Numpy-discussion mailing list