Python Numpy,在C+中创建1D数组+;断层
我正在尝试用c++为numpy创建一个1D数组:Python Numpy,在C+中创建1D数组+;断层,python,c++,numpy,boost-python,Python,C++,Numpy,Boost Python,我正在尝试用c++为numpy创建一个1D数组: 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) { us
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\u SimpleNew的调用时出错,尽管我调用了import\u array,这似乎是导致这种分段错误的常见原因。如果我制作一个二维维度数组[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()
知道为什么会出现这种情况吗?我不确定您是如何将PyObject*公开给Python的,但我认为正确的方法是通过boost::Python::object公开它 另一点是,您正在使用PyObject调用boost::python::object。虽然这是可能的,但不推荐(见大卫·亚伯拉罕的著作)。因此,应该使用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);
}
boost::python::object foo()
{
npy_intp dims[1]={10};
PyObject*p_array=PyArray_SimpleNew(boost::size(dims)、dims、NPY_FLOAT);
boost::python::handle(boost::python::借用(p_数组));
返回boost::python::object(句柄);
}
不要认为这是问题所在,因为它在返回之前会崩溃,并且可以使用2D阵列。但是谢谢你的回答。仅仅因为它使用2D阵列并不意味着它是正确的。我已经编辑了答案,提供了一个解释句柄重要性的链接。但是我需要一个来自boost::python::object的转换器,它只返回incremf(boost\u py_obj->ptr()):PyObject*convert(boost::python::object obj){return boost::python::incremf(obj->ptr));}?我已经编辑了这个问题,不使用boost::python::object,那么我就不需要这个句柄了,因为我没有讨论boost::python::object?它在哪一行?请提供一个详细的错误消息(不仅仅是一个函数;也告诉我们如何调用它),它在调用PyArray_SimpleNewMy时出错。我的注释不仅仅是第一句话。