VC++調(diào)用Python——Numpy數(shù)組的傳輸與讀取
可隨意轉(zhuǎn)載,不用問(wèn)。
一、前期工作
本文延續(xù)前文的那個(gè) cppwithpython 的例子。另外,為了偷懶方便,所有的動(dòng)態(tài)分配都沒(méi)有釋放內(nèi)存,請(qǐng)不要模仿。
首先,如果沒(méi)有安裝 numpy,則用管理員權(quán)限打開(kāi) anaconda prompt,在虛擬環(huán)境中安裝 numpy
然后找到 numpy 的安裝地址——?C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages\numpy
將 C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages\numpy\core\include 這個(gè)文件夾?include 到 Visual Studio 的 C++?項(xiàng)目中。詳細(xì)方法參見(jiàn)前文 include python 頭文件的方法。
然后我們就可以在項(xiàng)目中導(dǎo)入 numpy 的 header 了
另外,別忘了將?C:\ProgramData\Anaconda3\envs\cppwithpython\Lib\site-packages 這個(gè)文件夾加入到?module_search_paths 中(詳細(xì)方法見(jiàn)前文)
然后我們利用以下代碼初始化 numpy
二、從 C++ 傳輸數(shù)據(jù)給? Python
我們這里依舊是用前文的 D:\demo.py 這個(gè)文件,并且依舊沿用前文調(diào)用 python 函數(shù)的代碼,但是 demo.py 這個(gè)文件里面的內(nèi)容改為
這里的函數(shù),相較之前的 PrintHelloWorld, 帶有了一個(gè)參數(shù) arr,這個(gè)參數(shù) arr 需要我們?cè)贑++端構(gòu)建
這里我們構(gòu)建一個(gè)簡(jiǎn)單的 pystring
然后,傳遞參數(shù)時(shí),我們需要構(gòu)建一個(gè) tuple
然后我們把這個(gè) tuple 傳到 python 端
然后我們可以看到我們的控制臺(tái)成功的顯示了?Hello World From C++

三、構(gòu)建 Numpy 數(shù)組
接下來(lái)我們需要在 C++ 端構(gòu)建一個(gè) numpy 的數(shù)組,我們首先從簡(jiǎn)單的?numpy.empty 開(kāi)始
以上代碼允許我們建立一個(gè) 6×6 的數(shù)據(jù)類型為 float32 的 empty 矩陣
我們可以在控制臺(tái)看到它的輸出

除此以外,我們可以在 C++ 里面構(gòu)造數(shù)組
最后在控制臺(tái)的輸出如圖所示

完整代碼如下
四、從 Python 接收數(shù)據(jù)
以上的代碼已經(jīng)可以從 python 里面接受函數(shù)的返回值,現(xiàn)在,我們?cè)?demo.py 中再加入一個(gè)函數(shù)
然后我們可以獲取這個(gè)函數(shù)的返回值。另外,利用?PyArray_Check?這個(gè)函數(shù),可以檢測(cè)返回的 PyObject 的類型是不是 ndarray

此外,我們還可以在 C++ 端對(duì)返回以后的數(shù)組進(jìn)行一些計(jì)算
以上代碼可得如下結(jié)果

當(dāng)然我們還可以 index 我們返回的數(shù)組(這里我不是很確定有沒(méi)有更好的辦法,因?yàn)檫B續(xù)兩次 reinterpret_cast 顯得很奇怪)
以上的代碼將會(huì)得到如下的結(jié)果


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