VC++调用Python——Numpy数组的传输与读取
可随意转载,不用问。
一、前期工作
本文延续前文的那个 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 矩阵
我们可以在控制台看到它的输出

除此以外,我们可以在 C++ 里面构造数组
最后在控制台的输出如图所示

完整代码如下
四、从 Python 接收数据
以上的代码已经可以从 python 里面接受函数的返回值,现在,我们在 demo.py 中再加入一个函数
然后我们可以获取这个函数的返回值。另外,利用 PyArray_Check 这个函数,可以检测返回的 PyObject 的类型是不是 ndarray

此外,我们还可以在 C++ 端对返回以后的数组进行一些计算
以上代码可得如下结果

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


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