如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?

How to get data from np.array to std::vector in c++ using <numpy/arrayobject.h>?

本文关键字:array np 数据 获取 std vector c++ numpy lt 何使用 arrayobject      更新时间:2023-10-16

这是我在此站点上的第一个问题。

首先,我需要在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对象。