Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy,在C+中创建1D数组+;断层_Python_C++_Numpy_Boost Python - Fatal编程技术网

Python Numpy,在C+中创建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

我正在尝试用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)
{
    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时出错。我的注释不仅仅是第一句话。