如何獲取numpy數組的真實地址?如何與ctypes數組共享內存?

2021-01-11 編碼那些事

01如何獲取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個元素標明了該數組是否為「只讀」屬性。

02如何與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是否為同一個內存空間。

03結論

上面的例子表明,在Python編程中,numpy類型的數組與ctypes類型的數組可以進行互換,比如,可以使用numpy庫進行複雜的運算後,再轉換成ctypes類型的數組,傳遞到第3方的動態庫dll函數中作進一步的處理,這樣,在某些場合下,既能使用numpy庫的強大運算功能,又可以使用第三方庫,來實現我們特定的處理需求。

本文由編碼那些事原創,歡迎關注+轉發+收藏+點讚,帶你一起長知識!

相關焦點

  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    詳細細節請參考:python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數、Python使用ctypes模塊調用DLL函數之傳遞結構體參數這次講一下在Python中使用ctypes模塊調用DLL中的庫函數傳遞數組參數的情況。
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    這兒就涉及到了如何將C語言中的複數數組(Complex array)類型與Python中的數據類型進行交互的問題。在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,前面多篇文章中已經講了傳遞數值/指針/字符串參數、傳遞結構體參數、傳遞普通數組類型的例子,大家可以回看一下,這樣可以更好的理解本次要講的內容。
  • NumPy ndarray數組元素的獲取
    生成 ndarray 數組後,如何讀取我們所需要的數據呢?
  • D02 Numpy常用函數,如何優雅的遍歷一個多維數組?
    title: D02|Numpy常用函數author: Adolph Leecategories: 數據挖掘基礎tags:Python數據挖掘基礎Numpy如何遍歷一個數組,使用嵌套for循環嗎?reshapenumpy.reshape(arr, newshape, order=』C』)arr 是需要改變形狀的數組newshape 是新數組的維度屬性,新數組的維度屬性應與原數組兼容,例如行列相等order 是指定按行序或列序改變數組,』C』 — 按行,』F』 — 按列,』A』 — 原順序,』k』 — 元素在內存中的出現順序。其默認值為』C』。
  • Python數據分析類庫系列-Numpy之多維數組ndarray
    NumPy之於數值計算特別重要的原因之一,是因為它可以高效處理大數組的數據。 這是因為: NumPy是在一個連續的內存塊中存儲數據,獨立於其他Python內置對象。NumPy的C語言編寫的算法庫可以操作內存,而不必進行類型檢查或其它前期工作。
  • NumPy ndarray數組的創建
    ,再運行,就可以很方便地看到如何使用函數的幫助信息。輸入np.然後按 Tab 鍵,將出現如下界面:圖1:查看 NumPy 可以使用的函數運行如下命令,便可查看函數 abs 的詳細幫助信息。np.abs?NumPy 不但強大,而且還非常友好。
  • Python數據分析之numpy數組全解析
    1 什麼是numpy2 numpy數組創建2.1 基本方法:np.array()2.2 通用方法:np.ones()、np.zeros()、np.eye()2.3 讀取外部數據3 numpy中數組的數據類型4 numpy中數組的形狀5 索引與切片5.1 按索引取值
  • NumPy基礎教程,帶你玩轉多維數組
    Python 中的標準 type 函數同樣可以用於顯示數組類型,NumPy 有它自己的類型如:numpy.int32, numpy.int16, 和 numpy.float64,其中「int」和「float」代表數據的種類是整數還是浮點數,「32」和「16」代表這個數組的字節數(存儲大小)。ndarray.itemsize:數組中每個元素的字節存儲大小。
  • Python編程:如何規範numpy中數組元素的列印輸出格式
    引言對於Python語言開發者,如果你經常處理大量數據運算的話,numpy是一個必不可少的程序擴展庫,它支持大維度數組與矩陣運算,提供了非常豐富的數學運算函數,並且,相對於Python自身提供的列表類型,它在運算速度上有著無與倫比的優勢。
  • Numpy的ndarray:一種多維數組對象
    前言Numpy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。可以利用這種數組對整塊數據執行一些數學運算。模塊導入方式如下:import numpy as npndarray是一個通用的同構數據多維容器,也就是說,其中的所有元素必須是相同類型的。
  • NumPy數組中的廣播機制及結構化數組
    前面講過,在NumPy中,如何通過用表示數組各個維度長度的元素(也就是數組的型)把數組轉換成多維數組。因此,若兩個數組的各維度兼容,也就是兩個數組的每一維等長,或其中一個數組為一維,那麼廣播機制就適用。如果這兩個條件都不能滿足,NumPy就會拋出異常,說這兩個數組不兼容。執行完代碼之後,我們就得到了兩個數組:4x4的數組以及一個一行四列的數組。
  • NumPy的數組對象
    一、創建數組可以有多種方式創建NumPy數組:(1)使用NumPy的array函數從Python列表中創建數組,數組類型由列表中的數據類型確定;(2)使用NumPy的zeros函數創建數組元素全部為0的數組,默認情況下數組元素的類型為float64;(3)使用NumPy的ones函數創建數組元素全部為1的數組,默認情況下數組元素的類型為float64;(4)使用NumPy
  • NumPy中的廣播:對不同形狀的數組進行操作
    在機器學習領域,無論原始數據採用哪種格式,都必須將其轉換為數字數組以進行計算和分析。 因此,需要對陣列進行快速,魯棒和準確的計算,以對數據執行有效的操作。  NumPy是科學計算的主要庫,因為它提供了我們剛剛提到的功能。 在本文中,我們重點介紹正在廣播的NumPy的特定類型的操作。  廣播描述了在算術運算期間如何處理具有不同形狀的數組。
  • 如何使用Numpy數組?
    【連續「Python利用Numpy數組進行數據處理(一)」】2.【聚合函數】數學和統計方法[軸和0]可以通過數組上的一組數學函數對整個數組或某個軸向的數組進行統計計算。>說明sum對數組中全部或某軸向的元素求和。
  • Python入門教程(二):Numpy數組基礎
    Python中的數組操作幾乎等同於Numpy數組操作,今天我們會展示用Numpy數組操作獲取數據或者子數組,對數組進行分裂,變形和連接的例子。首先,我們先介紹幾類基本的數組操作:數組的屬性確定數組的大小,形狀,儲存大小,數據類型數組的索引:獲取和設置各個元素的值數組的切分:在大的數組中獲取或設置更小的子數組
  • Python教程:numpy數組初始化為相同的值
    有時我們需要將numpy數組初始化為相同的值,numpy提供了一些方法幫助我們實現這個目的。 1. np.zeros np.zeros返回來一個給定形狀和類型的用0填充的數組。
  • Python Numpy-數組的常用函數
    日常使用numpy進行數據分析的時候,通常會使用模塊提供的函數,很大程度上方便了對於數據的操作。
  • Python學習第113課——numpy中用條件判斷去篩選數組中的元素
    之前我們學習了如何在numpy中查找數組元素的方法和技巧,現在我們學習如何用條件判斷的方式篩選數組的元素。●numpy中的數組可以直接進行比較直接上代碼:運行結果:我們看到,condition列印出來,它的結構和h的結構一樣。
  • 圖解NumPy,這是理解數組最形象的一份教程了
    本文將介紹使用 NumPy 的一些主要方法,以及在將數據送入機器學習模型之前,它如何表示不同類型的數據(表格、圖像、文本等)。import numpy as np創建數組我們可以通過傳遞一個 python 列表並使用 np.array()來創建 NumPy 數組(極大可能是多維數組)。
  • Python NumPy面向數組的編程(附詳細代碼)
    到最後,能夠將過程編程的樣式優化,基於數組的樣式,能夠達到快速而無循環的效果。數組創建導入NumPy之後import numpy as np,我們就可以滾動了:一維我們可以通過傳遞一個元素列表來創建一個數組。