2017-03-20 55 views
1

我正在嘗試使用Numpy C API在C++中創建Numpy數組,並將其封裝在實用程序類中。大多數事情都按預期工作,但每當我嘗試使用其中一個函數創建一個數組時,程序立即發生段錯誤。創建PyArray_Descr的正確方法是什麼?Numpy C API - 使用PyArray_Descr進行數組創建會導致段錯誤

這是不工作的代碼的示例:

PyMODINIT_FUNC 
PyInit_pysgm() 
{ 
    import_array(); 
    return PyModule_Create(&pysgmmodule); 
} 

// .... 

static PyAry zerosLike(PyAry const& array) 
{ 
    PyArray_Descr* descr = new PyArray_Descr; 
    Py_INCREF(descr); // creation function steals a reference 
    descr->type = 'H'; 
    descr->type_num = NPY_UINT16; 
    descr->kind = 'u'; 
    descr->byteorder = '='; 
    descr->alignment = alignof(std::uint16_t); 
    descr->elsize = sizeof(std::uint16_t); 
    std::vector<npy_intp> shape {array.shape().begin(), array.shape().end()}; 
    // code segfaults after this line before entering PyAry constructor 
    return PyAry(PyArray_Zeros(shape.size(), shape.data(), descr, 0)); 
} 

(測試用UINT16)。

我沒有設置typeobj字段,這可能是唯一的問題,但我無法確定PyTypeObject類型的合適值是什麼。

編輯This page列出了不同類型的ScalarArray PyTypeObject實例。添加線

descr->typeobj = &PyUShortArrType_Type; 

尚未解決問題。

回答

2

使用

descr = PyArray_DescrFromType(NPY_UINT16); 

我是最近才寫了對numpy的C-API,但是從我收集PyArray_Descr基本上是從蟒蛇土地的D型嘗試。你應該自己構建這些,如果可以的話,使用FromType宏。

+0

哎呦 - 我的意思是回到這個 - 你是對的,這是我找到的答案。 – Qualia

相關問題