欢迎光临散文网 会员登陆 & 注册

VC++调用Python——Numpy数组的传输与读取

2022-12-07 23:35 作者:刹那-Ksana-  | 我要投稿

可随意转载,不用问。

一、前期工作

本文延续前文的那个 cppwithpython 的例子。另外,为了偷懒方便,所有的动态分配都没有释放内存,请不要模仿

首先,如果没有安装 numpy,则用管理员权限打开 anaconda prompt,在虚拟环境中安装 numpy

然后找到 numpy 的安装地址—— C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages\numpy

C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages\numpy\core\include 这个文件夹 include 到 Visual Studio 的 C++ 项目中。详细方法参见前文 include python 头文件的方法。

然后我们就可以在项目中导入 numpy 的 header 了

另外,别忘了将 C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages 这个文件夹加入到 module_search_paths 中(详细方法见前文)

然后我们利用以下代码初始化 numpy

二、从 C++ 传输数据给  Python

我们这里依旧是用前文的 D:\demo.py 这个文件,并且依旧沿用前文调用 python 函数的代码,但是 demo.py 这个文件里面的内容改为

这里的函数,相较之前的 PrintHelloWorld, 带有了一个参数 arr,这个参数 arr 需要我们在C++端构建

这里我们构建一个简单的 pystring

然后,传递参数时,我们需要构建一个 tuple

然后我们把这个 tuple 传到 python 端

然后我们可以看到我们的控制台成功的显示了 Hello World From C++

三、构建 Numpy 数组

接下来我们需要在 C++ 端构建一个 numpy 的数组,我们首先从简单的 numpy.empty 开始

以上代码允许我们建立一个 6×6 的数据类型为 float32 的 empty 矩阵

我们可以在控制台看到它的输出

相当于 numpy.empty((6,6), dtype=numpy.float32)

除此以外,我们可以在 C++ 里面构造数组

最后在控制台的输出如图所示

完整代码如下

四、从 Python 接收数据

以上的代码已经可以从 python 里面接受函数的返回值,现在,我们在 demo.py 中再加入一个函数

然后我们可以获取这个函数的返回值。另外,利用 PyArray_Check 这个函数,可以检测返回的 PyObject 的类型是不是 ndarray

Transpose 后的结果

此外,我们还可以在 C++ 端对返回以后的数组进行一些计算

以上代码可得如下结果

当然我们还可以 index 我们返回的数组(这里我不是很确定有没有更好的办法,因为连续两次 reinterpret_cast 显得很奇怪)

以上的代码将会得到如下的结果

以上这些就是 numpy 和 C++ 交互的基本操作了。

VC++调用Python——Numpy数组的传输与读取的评论 (共 条)

分享到微博请遵守国家法律