从PyArray_SimpleNewFromData创建Numpy NDArray的问题

时间:2016-07-28 08:16:03

标签: python c++ numpy wrapper

我尝试使用python包装器将一些C ++函数和类型绑定到python。我的问题是当我尝试将自定义矩阵类型转换为numpy ndarray时。最有说服力的解决方案是使用PyArray_SimpleNewFromData

为了测试它的行为,因为我没有设法做我想做的事情,我试图实现一个简单的测试:

PyObject* ConvertToPython(...) {
    uint8_t test[10] = {12, 15, 82, 254, 10, 32, 0, 8, 127, 54};
    int32_t ndims = 1;
    npy_intp dims[1];
    dims[0] = 10;
    int32_t typenum = (int32_t)NPY_UBYTE;
    PyObject* python_object = PyArray_SimpleNewFromData(ndims, dims, typenum, (void*)test);
    Py_XINCREF(python_object);
    return python_object;
}

然后我在python中得到了这些结果:

type(test) = <type 'numpy.ndarray'>
test.ndim = 1
test.dtype = uint8
test.shape = (10,)

但是数组中的值是:

test.values = [ 1  0  0  0  0  0  0  0 80  8]

我无法弄清楚,我做错了什么?而且我在使用python Wrapper时并不是很有经验,所以任何帮助都会很明显!

1 个答案:

答案 0 :(得分:2)

我会尝试使用malloc分配的数组,然后设置一些名为OWNDATA的标志以避免内存泄漏。

如果numpy.ndarray的实例不复制数据但只存储指向所提供数组的指针,则至少可以解释垃圾数据。函数返回后,指向堆栈已分配数组的指针指向内存,可能会在堆栈更改时随时更改。