这是我在这个网站上的第一个问题。
首先,我需要在C ++中为python创建一个带有一个函数的模块,它必须使用<numpy/arrayobject.h>
与numpy一起工作。此函数采用一个numpy数组并返回两个numpy数组。所有阵列都是一维的。
第一个问题是如何从numpy数组中获取数据?我想从std :: vector中的数组中收集信息,这样我就可以轻松地使用C ++了。
第二个:我是对的,该函数应该返回一个数组的元组,然后我的模块的用户可以在python:arr1, arr2 = foo(arr)
中这样写吗?怎么这样回来?
非常感谢你。
NumPy包含lots of functions and macros,可以很容易地访问C或C ++扩展中的ndarray
对象的数据。鉴于一个名为ndarray
的v
,可以使用i
访问元素PyArray_GETPTR1(v, i)
。因此,如果你想将数组中的每个元素复制到相同类型的std::vector
,你可以迭代每个元素并复制它,就像这样(我假设一个double
s数组):
npy_intp vsize = PyArray_SIZE(v);
std::vector<double> out(vsize);
for (int i = 0; i < vsize; i++) {
out[i] = *reinterpret_cast<double*>(PyArray_GETPTR1(v, i));
}
也可以做类似memcpy
的批量操作,但请记住,NumPy ndarray
s可能会因数据类型错位,具有非本机字节顺序或其他微妙属性,使得此类副本不太理想。但假设你知道这些,可以做到:
npy_intp vsize = PyArray_SIZE(v);
std::vector<double> out(vsize);
std::memcpy(out.data(), PyArray_DATA(v), sizeof(double) * vsize);
使用任何一种方法,out
现在都包含ndarray
数据的副本,您可以根据自己的喜好对其进行操作。请记住,除非您确实需要将数据作为std::vector
,否则NumPy C API可以完美地在您的扩展中用作访问和操作数据的方式。也就是说,除非你需要将数据传递给其他必须使用std::vector
的函数,或者你想使用依赖于std::vector
的C ++库代码,否则我会考虑直接对本机数组类型进行所有处理。
至于你的上一个问题,通常使用PyArg_BuildValue
来构造一个从扩展函数返回的元组。你的元组只包含两个ndarray
对象。