Affichez les données C / C ++ comme np.array à partir de Python.
typedef struct Particle {
float x[3], v[3];
} Particle;
const int np=10;
Particle* const p= calloc(sizeof(Particle), np);
for(int i=0; i<np; ++i) {
p[i].x[0]= (float) i + 1;
}
Si vous voulez passer ceci à Python en tant que np.array, vous pouvez utiliser la fonction PyArray_SimpleNewFromData
. [^ 1]
Cependant, ici je vais vous montrer comment ne transmettre qu'une partie des données, x [3]
, comme np.array à Python. Dans certains cas, la structure de données peut contenir plusieurs types et pas tous dans un np.array.
Si les données n'existent pas en continu dans la mémoire comme ceci, mais qu'elles sont disposées à intervalles réguliers, vous pouvez définir des «foulées». [^ 2]
PyObject* PyArray_New(PyTypeObject* subtype, int nd, npy_intp* dims,
int type_num, npy_intp* strides, void* data,
int itemsize, int flags, PyObject* obj);
Qu'est-ce que strides []
? Quand ʻaest np.array,
strides [0]est la différence d'octet entre ʻa [i, j] ʻ et ʻa [i + 1, j]
,strides []
[1] ʻest la différence d'octet entre ʻa [i, j] et ʻa [i, j + 1]
.
static PyObject* py_as_nparray(PyObject *self, PyObject *args)
{
const int nd=2;
const int ncol= 3;
npy_intp dims[]= {np, ncol};
npy_intp strides[]= {sizeof(Particle), sizeof(float)};
return PyArray_New(&PyArray_Type, nd, dims, NPY_FLOAT, strides, p->x, 0, 0, 0);
}
import numpy as np
import cext08
a = cext08.as_nparray()
[[ 1. 0. 0.]
[ 2. 0. 0.]
[ 3. 0. 0.]
[ 4. 0. 0.]
...
https://github.com/junkoda/python_c_ext/tree/master/08_nparray_stride
Recommended Posts