如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?
How to get data from np.array to std::vector in c++ using <numpy/arrayobject.h>?
这是我在此站点上的第一个问题。
首先,我需要在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
对象。
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 我可以安全地复制矢量<array>吗?
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?