您現在的位置是:首頁 > 運動
如何獲取numpy陣列地址?如何與ctypes陣列共享記憶體?
陣列取地址怎麼取
1、如何獲取numpy陣列元素的真實地址?
在Python程式設計中,numpy是一個很好用的擴充套件程式庫,將其與SciPy庫和 Matplotlib繪相簿一起使用,可構成一個強大的類似於Matlab的科學計算環境,有助於我們透過 Python 學習資料科學或者機器學習。在Python中,當你定義了一個numpy型別的陣列後,它內部元素的真實地址如何獲得呢?
這裡可以透過numpy陣列的“__array_interface__”介面得到。
比如下面的例子:
import numpy as np from ctypes import * a = np。array([1, 2, 3, 4, 5], dtype=np。uint8) print(a。__array_interface__[‘data’])
上面程式定義了一個numpy型別的陣列a,執行後得到:
(1883707159072, False)
介面“__array_interface__”返回一個包含兩個元素的元組,其第1個元素即為a陣列內部元素存放的真實地址,第2個元素標明瞭該陣列是否為“只讀”屬性。
2、如何與ctypes庫建立的陣列共享記憶體空間?
對於Python程式設計人員來說,ctypes庫也是使用率比較高的一個庫,當呼叫第三方提供的動態庫連結庫函式時,它經常用於定義與C語言相容的資料型別變數,作為Python語言與C語言進行資料互動的橋樑。
那麼,如何使用ctypes庫定義一個與numpy共享記憶體空間的陣列變數呢?
仍以上面的例子,定義一個uint8型別的陣列b,與a陣列共享記憶體區域,可使用下面的程式碼:
b = (c_uint8*len(a))。from_address(a。__array_interface__[‘data’][0]) print(‘a =’, a, ‘\nb =’, b[:])
執行後得到:
a = [1 2 3 4 5] b = [1, 2, 3, 4, 5]
可見,使用ctypes庫的from_address函式定義了一個與a同地址的陣列b,打印出b的元素值後,其初始元素值確實與陣列a相同。
下面驗證一下,陣列a和b裡面的元素是否真正的佔用同一個記憶體區域。
先改變陣列a中第1個元素的值,執行下面的程式碼:
a[0] = 10 print(‘a =’, a, ‘\nb =’, b[:]}])
其執行結果為:
a = [10 2 3 4 5] b = [10, 2, 3, 4, 5]
可見,將陣列a中的第一個元素的值由1改成10後,b陣列中第一個元素也同步改變成10了。
緊接著,再改變b陣列中第二個元素的值,由2改為20:
b[1] = 20 print(‘a =’, a, ‘\nb =’, b[:])
其執行結果為:
a = [10 20 3 4 5] b = [10, 20, 3, 4, 5]
顯然,陣列a中第二個元素的值也同步改變為20了。
因此,陣列a與陣列b確實是佔用的同一個記憶體地址空間。
另外,也可以透過陣列b再定義一個與b共享記憶體區域的numpy陣列c,使用下面的程式碼即可:
c = np。frombuffer(b, dtype=np。uint8)
大家可以自行驗證陣列a、b、c是否為同一個記憶體空間。
3、結論
上面的例子表明,在Python程式設計中,numpy型別的陣列與ctypes型別的陣列可以進行互換,比如,可以使用numpy庫進行復雜的運算後,再轉換成ctypes型別的陣列,傳遞到第3方的動態庫dll函式中作進一步的處理,這樣,在某些場合下,既能使用numpy庫的強大運算功能,又可以使用第三方庫,來實現我們特定的處理需求。
本文由編碼那些事原創,歡迎關注+轉發+收藏+點贊,帶你一起長知識!
推薦文章
- 這才是中年女人該有的秋季穿搭:“膝下裙+裸靴”,優雅又得體
要想把膝下裙+裸靴搭配得出色,你需要注意這些方面:tips1:在搭配上要把腰線凸顯出來不管你是高個子還是矮個子,也不管你的身材是胖是瘦,在面對大部分的穿搭組合的時候,都要儘量把腰線凸顯出來,這樣才能更好的修飾我們的身材,不至於讓整體的loo...
- 衝牙器適合什麼人群使用?個護師揭秘四大騙局陷阱!
適合使用衝牙器的朋友也要選擇各項引數都經過專業技術調校的優質產品哦,因為毫無技術實力的劣質產品存在極大的傷牙隱患,千萬不能用...
- 火箭訊息:3新星入選全明星,小波特未考慮復出,榜眼傷情更新
最後需要談及的是,火箭在對陣雷霆比賽之前的傷病報告已經出爐,除了小凱文-波特無法出戰之外,火箭新星杰倫-格林也將無法出戰這場比賽:而且據美媒亞當-斯波拉內的說法,杰倫-格林並沒有參加火箭今天的隊內訓練:杰倫-格林毫無疑問是這支火箭陣中最好的...