如何使用C ++从np.array中获取数据到std :: vector ?

问题描述 投票:0回答:1

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

首先,我需要在C ++中为python创建一个带有一个函数的模块,它必须使用<numpy/arrayobject.h>与numpy一起工作。此函数采用一个numpy数组并返回两个numpy数组。所有阵列都是一维的。

第一个问题是如何从numpy数组中获取数据?我想从std :: vector中的数组中收集信息,这样我就可以轻松地使用C ++了。

第二个:我是对的,该函数应该返回一个数组的元组,然后我的模块的用户可以在python:arr1, arr2 = foo(arr)中这样写吗?怎么这样回来?

非常感谢你。

python c++ arrays python-3.x numpy
1个回答
1
投票

NumPy包含lots of functions and macros,可以很容易地访问C或C ++扩展中的ndarray对象的数据。鉴于一个名为ndarrayv,可以使用i访问元素PyArray_GETPTR1(v, i)。因此,如果你想将数组中的每个元素复制到相同类型的std::vector,你可以迭代每个元素并复制它,就像这样(我假设一个doubles数组):

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 ndarrays可能会因数据类型错位,具有非本机字节顺序或其他微妙属性,使得此类副本不太理想。但假设你知道这些,可以做到:

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对象。

© www.soinside.com 2019 - 2024. All rights reserved.