, include, - , . , , - .
:
numpy, Python C
( , , , C- Python)
Numpy Python C , C. - Python
from numpy import array
from ctypes import c_long
values = array([1.0, 2.2, 3.3, 4.4, 5.5])
my_c_func(values.ctypes.data_as(c_void_p), c_long(values.size))
C :
void my_c_func(double *value, long size)
{
int i;
for (i = 0; i < size; i++)
printf("%ld : %.10f\n", i, values[i]);
}
... , ? , , ( Stackoverflow), - .
C, C- .
, , ... , ! :
/tuple/dictionary - Python... C !
, , , . , :-) , Python:
from numpy import array
my_list = (array([1.0, 2.2, 3.3, 4.4, 5.5]),
array([2.9, 3.8. 4.7, 5.6]))
my_c_func(py_object(my_list))
, , , PyObject.
C.
void my_c_func(PyObject *list)
{
int i, n_arrays;
n_arrays = PyObject_Length(list);
for (i = 0; i LT n_arrays; i++)
{
PyArrayObject *elem;
double *pd;
elem = PyList_GetItem(list,
i);
pd = PyArray_DATA(elem);
printf("Value 0 : %.10f\n", *pd);
}
}
:
- PyObject
- PyObject_Length().
PyList_GetItem() PyObject ( a void *)PyArray_DATA().
PyList_GetItem() PyObject *, Python.h ndarraytypes.h, , ( !):
typedef struct _object {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
PyArrayObject... . , . ob_type , Python. , . struct tp_name - , ... ; , ! , .
, ndarray? ... , , , ob_type. PyArray_DATA() :
#define PyArray_DATA(obj) ((void *)((PyArrayObject_fields *)(obj))->data)
PyArayObject * PyArrayObject_fields *, ( !):
typedef struct tagPyArrayObject_fields {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
char *data;
int nd;
npy_intp *dimensions;
npy_intp *strides;
PyObject *base;
PyArray_Descr *descr;
int flags;
PyObject *weakreflist;
} PyArrayObject_fields;
, , PyObject PyArrayObject, . , , , . . , .
, PyArrayObject http://docs.scipy.org/doc/numpy/reference/c-api.array.html
, PyArrayObject PyArray_SIZE(PyArrayObject *)
, , : -)