【发布时间】:2017-03-20 20:41:22
【问题描述】:
我正在尝试使用 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;
没有解决问题。
【问题讨论】: