簡體   English   中英

Numpy,在C ++段錯誤中創建一維數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM