Python — Numpy C ++: как перебрать PyArrayObject без ошибки сегмента

Для меня следующее все приводит к segfault:

my_array->descr->subarray->shape;
my_array->dimensions;
PyArray_SHAPE(my_array);
PyArray_DIMS(my_array);
PyArray_ITEMSIZE(my_array);
PyArray_NBYTES(my_array);

Моя функция выглядит так:

static PyObject* exterior(PyObject* self, PyArrayObject* old_simplices_array)
{//code here

Остальная часть моего файла cpp выглядит так:

#include "Python.h"#include "numpy/arrayobject.h"
/* function */

static PyMethodDef compiled_methods[] =
{
{"_exterior",(PyCFunction)exterior , METH_VARARGS},
{NULL,      NULL}        /* Sentinel */
};

PyMODINIT_FUNC init_alto(void)
{
(void) Py_InitModule("_alto", compiled_methods);
import_array();
}

Код Python, который передает массив во «внешний», просто передает массив Ux NxM. Эта часть работает. Я могу получить доступ к результатам и данным массива. Я просто не могу определить границы итерации. Я работаю из мудреца, если это что-то меняет.

Как я должен перебирать массив без segfaulting? Если ответ очевиден, пожалуйста, идиотостойкий ваш ответ.

Чтобы лучше понять, как выглядит функция, посмотреть здесь.

0

Решение

В прошлом я делал следующее для перебора PyArrayObject:

static PyObject *func1(PyObject *self, PyObject *args) {
PyArrayObject *X;
int ndX;
npy_intp *shapeX;
PyArray_Descr *dtype;
NpyIter *iter;
NpyIter_IterNextFunc *iternext;

PyArg_ParseTuple(args, "O!", &PyArray_Type, &X);
ndX = PyArray_NDIM(X);
shapeX = PyArray_SHAPE(X);
dtype = PyArray_DescrFromType(NPY_DOUBLE);

iter = NpyIter_New(X, NPY_ITER_READONLY, NPY_KEEPORDER, NPY_NO_CASTING, dtype);
if (iter==NULL) {
return NULL;
}
iternext = NpyIter_GetIterNext(iter, NULL);
dataptr = (double **) NpyIter_GetDataPtrArray(iter);

do {
cout << **dataptr << endl;
} while (iternext(iter));

NpyIter_Deallocate(iter);
return Py_BuildValue(something);
}

Чтобы узнать больше информации, перейдите по этой ссылке: http://docs.scipy.org/doc/numpy/reference/c-api.iterator.html

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]