这是我在此站点上的第一个问题。
首先,我需要在C 中使用一个功能为Python制作一个模块,该模块必须使用<numpy/arrayobject.h>
与Numpy一起使用。此功能采用一个Numpy数组,并返回两个Numpy数组。所有阵列都是一维的。
第一个问题是如何从Numpy数组中获取数据?我想从std :: vector中的数组中收集信息,因此我可以轻松地使用c 。
第二个:我对吗? arr1, arr2 = foo(arr)
?以及如何返回?
非常感谢。
numpy包含许多功能和宏,使得在C或C 扩展中访问ndarray
对象的数据非常容易。给定一个名为v
的1D ndarray
,可以使用PyArray_GETPTR1(v, i)
访问元素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
对象。