[Matrix-SIG] Accessing raw data in PyArrays from C

Edward C. Jones edcjones@erols.com
Wed, 10 Mar 1999 05:25:23 -0500


I have been writing some C code that extends NumPy. I find myself
regularly using the C macro:

#define ARRAYDATUM(type,charptr) (*( ((type) *) (charptr)))

to access the data in the array. For example, suppose "pao" is a
pointer to a PyArrayObject holding unsigned chars. Then

ARRAYDATUM(unsigned char, pao->data)

returns the first byte of data in the array. But this macro
assumes I know the type of the array.

In arraytypes.c, there are functions like (using UBYTE as an
example):

static PyObject * UBYTE_getitem(char *ip)
 {return PyInt_FromLong((long)*((unsigned char *)ip));}

static int UBYTE_setitem(PyObject *op, char *ov)
 {*((unsigned char *)ov)=PyInt_AsLong(op);return PyErr_Occurred()
? -1:0;}

I suggest that something like the following be added:

static unsigned byte UBYTE_getraw(char *ip)
 {return *((unsigned char *)ip);}

static int UBYTE_setraw(unsigned cahr b, char *ov)
 {*((unsigned char *)ov)=b;}

How can this be done?

Thanks,
  Ed Jones