gpt4 book ai didi

c++ - NumPy 的 C++ : How to iterate over PyArrayObject without a segfault

转载 作者:行者123 更新时间:2023-11-28 03:09:50 29 4
gpt4 key购买 nike

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

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 数组。那部分有效。我可以访问阵列的步幅和数据。我只是无法确定迭代的范围。如果有任何不同,我会在 sage 内部工作。

我应该如何在不出现段错误的情况下遍历数组?如果答案很明显,请对你的答案进行白痴测试。

为了更好地了解函数的外观,see here .

最佳答案

在过去,我曾执行以下操作来遍历 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

关于c++ - NumPy 的 C++ : How to iterate over PyArrayObject without a segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18789824/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com