Zeigen Sie C / C ++ - Daten in Python als np.array an.
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;
}
Wenn Sie dies als np.array an Python übergeben möchten, können Sie die Funktion PyArray_SimpleNewFromData
verwenden. [^ 1]
Hier werde ich Ihnen jedoch zeigen, wie Sie nur einen Teil der Daten "x [3]" als np.array an Python übergeben. In einigen Fällen kann die Datenstruktur mehrere Typen enthalten und nicht alle in einem np.array.
Wenn die Daten nicht kontinuierlich so im Speicher vorhanden sind, sondern in regelmäßigen Abständen angeordnet sind, können Sie "Schritte" festlegen. [^ 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);
Was ist "Schritte []"? Wenn "a" np.array ist, ist "Schritte [0]" die Byte-Differenz zwischen "a [i, j]" und "a [i + 1, j]", "Schritte []". [1] ist die Byte-Differenz zwischen
a [i, j] und
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