2017-03-20 3 views
1

Numpy C APIを使用してCumpでNumpy配列を作成しようとしていますが、ユーティリティクラスでラップされています。ほとんどのものは期待どおりに動作していますが、PyArray_Descr*を取る関数の1つを使って配列を作成しようとすると、プログラムは直ちにsegfaultsします。作成のためにPyArray_Descrを設定する正しい方法は何ですか?Numpy C API - 配列の作成にPyArray_Descrを使用するとsegfaultsが発生する

動作していないコードの例:

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

は、私はごく最近numpyのC-APIに対する書き込みが、私はPyArray_Descrは基本的にのpython-土地からDTYPEで集めるものとされてきた

descr = PyArray_DescrFromType(NPY_UINT16); 

を使用してみてください。できるだけこれらを自分で構築し、FromTypeマクロを使用する必要があります。

+0

おっと - 私はこれに戻ってくるつもりでした。あなたは正しい、これは私が見つけた答えです。 – Qualia

関連する問題