1、如何獲取numpy數(shù)組元素的真實地址?在Python編程中,numpy是一個很好用的擴展程序庫,將其與SciPy庫和 Matplotlib繪圖庫一起使用,可構(gòu)成一個強大的類似于Matlab的科學計算環(huán)境,有助于我們通過 Python 學習數(shù)據(jù)科學或者機器學習。在Python中,當你定義了一個numpy類型的數(shù)組后,它內(nèi)部元素的真實地址如何獲得呢?
這里可以通過numpy數(shù)組的“__array_interface__”接口得到。 比如下面的例子:
上面程序定義了一個numpy類型的數(shù)組a,運行后得到:
接口“__array_interface__”返回一個包含兩個元素的元組,其第1個元素即為a數(shù)組內(nèi)部元素存放的真實地址,第2個元素標明了該數(shù)組是否為“只讀”屬性。 2、如何與ctypes庫創(chuàng)建的數(shù)組共享內(nèi)存空間?對于Python編程人員來說,ctypes庫也是使用率比較高的一個庫,當調(diào)用第三方提供的動態(tài)庫鏈接庫函數(shù)時,它經(jīng)常用于定義與C語言兼容的數(shù)據(jù)類型變量,作為Python語言與C語言進行數(shù)據(jù)交互的橋梁。 那么,如何使用ctypes庫定義一個與numpy共享內(nèi)存空間的數(shù)組變量呢? 仍以上面的例子,定義一個uint8類型的數(shù)組b,與a數(shù)組共享內(nèi)存區(qū)域,可使用下面的代碼:
運行后得到:
可見,使用ctypes庫的from_address函數(shù)定義了一個與a同地址的數(shù)組b,打印出b的元素值后,其初始元素值確實與數(shù)組a相同。 下面驗證一下,數(shù)組a和b里面的元素是否真正的占用同一個內(nèi)存區(qū)域。 先改變數(shù)組a中第1個元素的值,運行下面的代碼:
其運行結(jié)果為:
可見,將數(shù)組a中的第一個元素的值由1改成10后,b數(shù)組中第一個元素也同步改變成10了。 緊接著,再改變b數(shù)組中第二個元素的值,由2改為20:
其運行結(jié)果為:
顯然,數(shù)組a中第二個元素的值也同步改變?yōu)?0了。 因此,數(shù)組a與數(shù)組b確實是占用的同一個內(nèi)存地址空間。 另外,也可以通過數(shù)組b再定義一個與b共享內(nèi)存區(qū)域的numpy數(shù)組c,使用下面的代碼即可:
大家可以自行驗證數(shù)組a、b、c是否為同一個內(nèi)存空間。 3、結(jié)論上面的例子表明,在Python編程中,numpy類型的數(shù)組與ctypes類型的數(shù)組可以進行互換,比如,可以使用numpy庫進行復雜的運算后,再轉(zhuǎn)換成ctypes類型的數(shù)組,傳遞到第3方的動態(tài)庫dll函數(shù)中作進一步的處理,這樣,在某些場合下,既能使用numpy庫的強大運算功能,又可以使用第三方庫,來實現(xiàn)我們特定的處理需求。 |
|
來自: lgk88888 > 《原創(chuàng)》