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

时间:2017-03-14 12:32:28

标签: python c++ numpy boost-python

我正在尝试在c ++中为numpy创建一维数组:

PyObject* foo()
{
   npy_intp length[1];
   length[0] = 10;
   PyObject* my_array = PyArray_SimpleNew(1, length, NPY_DOUBLE);
   return boost::python::incref(my_array);
}

然后我创建了一个python模块:

BOOST_PYTHON_MODULE(pyMod)
{
    using namespace boost::python;

    import_array();

    def("foo", foo);
}

当我在python中运行它,调用foo()时,它在执行对PyArray_SimpleNew的调用时会出现段错误,即使我调用了import_array,这似乎是这个segfaulting的常见原因。如果我制作尺寸为2D的数组[10,1],它就可以正常工作,即:

PyObject* foo()
{
   npy_intp length[2] = {10, 1};
   PyObject* my_array = PyArray_SimpleNew(2, length, NPY_DOUBLE);
   return boost::python::incref(my_array);
}

在python中,它就像这样使用

import numpy as np
import pyMod

if __name__ == "__main__":
    v = pyMod.foo()

为什么会出现这种段错误?

1 个答案:

答案 0 :(得分:0)

我不确定你是如何将PyObject *暴露给Python的,但我认为正确的方法是通过boost :: python :: object公开它。

另一点是你使用PyObject调用boost :: python :: object。尽管可能,但不建议这样做(参见David Abrahams撰写的guidelines)。所以应该使用boost :: python :: handle来解决这种情况。

boost::python::object foo()
{
   npy_intp dims[1] = {10};
   PyObject* p_array = PyArray_SimpleNew(boost::size(dims), dims, NPY_FLOAT);
   boost::python::handle<> handle(boost::python::borrowed(p_array));
   return boost::python::object(handle);
}