Numpy C++:如何在没有段错误的情况下迭代 PyArrayObject

Posted

技术标签:

【中文标题】Numpy C++:如何在没有段错误的情况下迭代 PyArrayObject【英文标题】:Numpy C++: How to iterate over PyArrayObject without a segfault 【发布时间】:2013-09-13 15:18:30 【问题描述】:

对我来说,以下所有都会导致段错误:

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 代码只传递了一个 NxM uint 数组。那部分有效。我可以访问数组的步幅和数据。我只是无法确定迭代的界限。如果这有什么不同,我会在圣人内部工作。

我应该如何在没有段错误的情况下迭代数组?如果答案很明显,请证明你的答案是白痴。

要更好地了解函数的外观,请see here。

【问题讨论】:

【参考方案1】:

在过去,我做了以下迭代 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

【讨论】:

我认为您的示例正在运行,但我只是得到一个 NULL 迭代器。你确定你不需要对 python 传递给 C 的数组做任何特殊的事情吗? 我编辑了上面的内容来展示 X 是如何被解析的。这对我有用。 PyArg_ParseTuple(args, "O!", &PyArray_Type, &X);

以上是关于Numpy C++:如何在没有段错误的情况下迭代 PyArrayObject的主要内容,如果未能解决你的问题,请参考以下文章

Numpy,在 C++ 段错误中创建一维数组

构建 Numpy C++ 扩展;调用 PyArray_FROM_OTF 时出现段错误

如何在没有错误消息的情况下调试 ctypes

在没有 foreach 的情况下迭代 JObject

如何在没有科学记数法和给定精度的情况下漂亮地打印 numpy.array?

如何在没有 numpy 或 pandas 的情况下从文本文件计算平均值