[英]Numpy, creating 1D array in C++ segfaults
我正在嘗試為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()時,即使我調用了import_array,它在執行對PyArray_SimpleNew的調用時也會出現段錯誤,這似乎是造成此段錯誤的常見原因。 如果我制作一個尺寸為[10,1]的2D數組,則效果很好,即:
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。 盡管有可能,但不建議這樣做(請參閱David Abrahams編寫的准則 )。 因此應該使用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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.