Numpy C API - 使用PyArray_Descr进行数组创建会导致段错误

时间:2017-03-20 20:41:23

标签: python c++ numpy

我试图使用Numpy C API在C ++中创建Numpy数组,包含在实用程序类中。大多数事情都按预期工作,但每当我尝试使用PyArray_Descr*之一的函数创建一个数组时,程序会立即发生段错误。设置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;

尚未解决问题。

1 个答案:

答案 0 :(得分:2)

尝试使用

descr = PyArray_DescrFromType(NPY_UINT16);

我最近才开始反对numpy C-API,但从我收集的内容来看,PyArray_Descr基本上是来自python-land的dtype。你应该自己构建这些并使用FromType宏。如果可以的话。