摘要:對于更高的維度,其長度等于表示的嵌套列表的長度。這是數組在連續表示時將會占用的空間總字節數。該值僅作為參考信息。新版功能一個表明內存是否為的布爾值。新版功能上一篇文章標準庫內置類型二進制序列類型下一篇文章標準庫內置類型集合類型映射類型
上一篇文章:Python標準庫---13、內置類型:二進制序列類型 ( bytes, bytearray)內存視圖
下一篇文章:Python標準庫---15、內置類型:集合類型、映射類型
memoryview 對象允許 Python 代碼訪問一個對象的內部數據,只要該對象支持 緩沖區協議 而無需進行拷貝。
class memoryview(obj)創建一個引用 obj 的 memoryview。 obj 必須支持緩沖區協議。 支持緩沖區協議的內置對象包括 bytes 和 bytearray。
memoryview 具有 元素 的概念,即由原始對象 obj 所處理的基本內存單元。 對于許多簡單類型例如 bytes 和 bytearray 來說,一個元素就是一個字節,但是其他的類型例如 array.array 可能有更大的元素。
len(view) 與 tolist 的長度相等。 如果 view.ndim = 0,則其長度為 1。 如果 view.ndim = 1,則其長度等于 view 中元素的數量。 對于更高的維度,其長度等于表示 view 的嵌套列表的長度。 itemsize 屬性可向你給出單個元素所占的字節數。
memoryview 支持通過切片和索引訪問其元素。 一維切片的結果將是一個子視圖:
>>> v = memoryview(b"abcefg") >>> v[1] 98 >>> v[-1] 103 >>> v[1:4]>>> bytes(v[1:4]) b"bce"
如果 format 是一個來自于 struct 模塊的原生格式說明符,則也支持使用整數或由整數構成的元組進行索引,并返回具有正確類型的單個 元素。 一維內存視圖可以使用一個整數或由一個整數構成的元組進行索引。 多維內存視圖可以使用由恰好 ndim 個整數構成的元素進行索引,ndim 即其維度。 零維內存視圖可以使用空元組進行索引。
這里是一個使用非字節格式的例子:
>>> import array >>> a = array.array("l", [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]
如果下層對象是可寫的,則內存視圖支持一維切片賦值。 改變大小則不被允許:
>>> data = bytearray(b"abcefg") >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b"z") >>> data bytearray(b"zbcefg") >>> v[1:4] = b"123" >>> data bytearray(b"z123fg") >>> v[2:3] = b"spam" Traceback (most recent call last): File "", line 1, in ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b"spam" >>> data bytearray(b"z1spam")
由帶有格式符號 "B", "b" 或 "c" 的可哈希(只讀)類型構成的一維內存視圖同樣是可哈希的。 哈希定義為 hash(m) == hash(m.tobytes()):
>>> v = memoryview(b"abcefg") >>> hash(v) == hash(b"abcefg") True >>> hash(v[2:4]) == hash(b"ce") True >>> hash(v[::-2]) == hash(b"abcefg"[::-2]) True
在 3.3 版更改: 一維內存視圖現在可以被切片。 帶有格式符號 "B", "b" 或 "c" 的一維內存視圖現在是可哈希的。
在 3.4 版更改: 內存視圖現在會自動注冊為 collections.abc.Sequence
在 3.5 版更改: 內存視圖現在可使用整數元組進行索引。
memoryview 具有以下一些方法:
__eq__(exporter)memoryview 與 PEP 3118 中的導出器這兩者如果形狀相同,并且如果當使用 struct 語法解讀操作數的相應格式代碼時所有對應值都相同,則它們就是等價的。
對于 tolist() 當前所支持的 struct 格式字符串子集,如果 v.tolist() == w.tolist() 則 v 和 w 相等:
>>> import array >>> a = array.array("I", [1, 2, 3, 4, 5]) >>> b = array.array("d", [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array("b", [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() True
如果兩邊的格式字符串都不被 struct 模塊所支持,則兩對象比較結果總是不相等(即使格式字符串和緩沖區內容相同):
>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b False
請注意,與浮點數的情況一樣,對于內存視圖對象來說,v is w 也 并不 意味著 v == w。
在 3.3 版更改: 之前的版本比較原始內存時會忽略條目的格式與邏輯數組結構。
tobytes()將緩沖區中的數據作為字節串返回。 這相當于在內存視圖上調用 bytes 構造器。
>>> m = memoryview(b"abc") >>> m.tobytes() b"abc" >>> bytes(m) b"abc"
對于非連續數組,結果等于平面化表示的列表,其中所有元素都轉換為字節串。 tobytes() 支持所有格式字符串,不符合 struct 模塊語法的那些也包括在內。
hex()返回一個字符串對象,其中分別以兩個十六進制數碼表示緩沖區里的每個字節。
>>> m = memoryview(b"abc") >>> m.hex() "616263"
3.5 新版功能.
tolist()將緩沖區內的數據以一個元素列表的形式返回。
>>> memoryview(b"abc").tolist() [97, 98, 99] >>> import array >>> a = array.array("d", [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
在 3.3 版更改: tolist() 現在支持 struct 模塊語法中的所有單字符原生格式以及多維表示形式。
release()釋放由內存視圖對象所公開的底層緩沖區。 許多對象在被視圖所獲取時都會采取特殊動作(例如,bytearray 將會暫時禁止調整大?。灰虼耍{用 release() 可以方便地盡早去除這些限制(并釋放任何多余的資源)。
在此方法被調用后,任何對視圖的進一步操作將引發 ValueError (release() 本身除外,它可以被多次調用):
>>> m = memoryview(b"abc") >>> m.release() >>> m[0] Traceback (most recent call last): File "", line 1, in ValueError: operation forbidden on released memoryview object 使用 with 語句,可以通過上下文管理協議達到類似的效果: >>> >>> with memoryview(b"abc") as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File " ", line 1, in ValueError: operation forbidden on released memoryview object
3.2 新版功能.
cast(format[, shape])將內存視圖轉化為新的格式或形狀。 shape 默認為 [byte_length//new_itemsize],這意味著結果視圖將是一維的。 返回值是一個新的內存視圖,但緩沖區本身不會被復制。 支持的轉化有 1D -> C-contiguous 和 C-contiguous -> 1D。
目標格式僅限于 struct 語法中的單一元素原生格式。 其中一種格式必須為字節格式 ("B", "b" 或 "c")。 結果的字節長度必須與原始長度相同。
將 1D/long 轉換為 1D/unsigned bytes:
>>> import array >>> a = array.array("l", [1,2,3]) >>> x = memoryview(a) >>> x.format "l" >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast("B") >>> y.format "B" >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24
將 1D/unsigned bytes 轉換為 1D/char:
>>> b = bytearray(b"zyz") >>> x = memoryview(b) >>> x[0] = b"a" Traceback (most recent call last): File "", line 1, in ValueError: memoryview: invalid value for format "B" >>> y = x.cast("c") >>> y[0] = b"a" >>> b bytearray(b"ayz")
將 1D/bytes 轉換為 3D/ints 再轉換為 1D/signed char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast("i", shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format "i" >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast("b") >>> z.format "b" >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48
將 1D/unsigned char 轉換為 2D/unsigned long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast("L", shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]
3.3 新版功能.
在 3.5 版更改: 當轉換為字節視圖時,源格式將不再受限。
還存在一些可用的只讀屬性:
obj內存視圖的下層對象:
>>> b = bytearray(b"xyz") >>> m = memoryview(b) >>> m.obj is b True
3.3 新版功能.
nbytesnbytes == product(shape) * itemsize == len(m.tobytes())。 這是數組在連續表示時將會占用的空間總字節數。 它不一定等于 len(m):
>>> import array >>> a = array.array("i", [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12
多維數組:
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast("d", shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96
3.3 新版功能.
readonly一個表明內存是否只讀的布爾值。
format一個字符串,包含視圖中每個元素的格式(表示為 struct 模塊樣式)。 內存視圖可以從具有任意格式字符串的導出器創建,但某些方法 (例如 tolist()) 僅限于原生的單元素格式。
在 3.3 版更改: 格式 "B" 現在會按照 struct 模塊語法來處理。 這意味著 memoryview(b"abc")[0] == b"abc"[0] == 97。
itemsizememoryview 中每個元素以字節表示的大小:
>>> import array, struct >>> m = memoryview(array.array("H", [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize("H") == m.itemsize Truendim
一個整數,表示內存所代表的多維數組具有多少個維度。
### shape
一個整數元組,通過 ndim 的長度值給出內存所代表的 N 維數組的形狀。
在 3.3 版更改: 當 ndim = 0 時值為空元組而不再為 None。
strides一個整數元組,通過 ndim 的長度給出以字節表示的大小,以便訪問數組中每個維度上的每個元素。
在 3.3 版更改: 當 ndim = 0 時值為空元組而不再為 None。
suboffsets供 PIL 風格的數組內部使用。 該值僅作為參考信息。
c_contiguous一個表明內存是否為 C-contiguous 的布爾值。
3.3 新版功能.
f_contiguous一個表明內存是否為 Fortran contiguous 的布爾值。 3.3 新版功能.contiguous
一個表明內存是否為 contiguous 的布爾值。
3.3 新版功能.
上一篇文章:Python標準庫---13、內置類型:二進制序列類型 ( bytes, bytearray)
下一篇文章:Python標準庫---15、內置類型:集合類型、映射類型
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44001.html
摘要:第行把具名元組以的形式返回。對序列使用和通常號兩側的序列由相同類型的數據所構成當然不同類型的也可以相加,返回一個新序列。從上面的結果可以看出,它雖拋出了異常,但仍完成了操作查看字節碼并不難,而且它對我們了解代碼背后的運行機制很有幫助。 《流暢的Python》筆記。接下來的三篇都是關于Python的數據結構,本篇主要是Python中的各序列類型 1. 內置序列類型概覽 Python標準庫...
摘要:目前有兩種內置集合類型,和。兩個類的構造器具有相同的作用方式返回一個新的或對象,其元素來自于。要表示由集合對象構成的集合,所有的內層集合必須為對象。目前僅有一種標準映射類型字典。 上一篇文章:Python標準庫---14、內置類型:二進制序列類型 (memoryview)下一篇文章:Python標準庫---16、內置類型:上下文管理器類型、其他、特殊屬性 集合類型 --- set, ...
摘要:上一篇文章標準庫內置類型迭代器類型序列類型下一篇文章標準庫內置類型二進制序列類型文本序列類型在中處理文本數據是使用對象,也稱為字符串。正式的定義為十進制數字符就是一般分類中的字符。 上一篇文章:Python標準庫---11、內置類型:迭代器類型、序列類型(list-typle-range)下一篇文章:Python標準庫---13、內置類型:二進制序列類型 ( bytes, bytear...
摘要:以便于用戶理解的方式返回對象的字符串表示形式。函數會調用函數,對來說,輸出的是一個有序對。此外,還有用于支持內置的構造函數的方法??缮⒘袑崿F了方法,使用推薦的異或運算符計算實例屬性的散列值私有屬性最好用命名規則來實現這種方式有好有壞 絕對不要使用兩個前導下劃線,這是很煩人的自私行為。——Ian Bicking 對象表示形式 repr() 以便于開發者理解的方式返回對象的字符串表示形式...
閱讀 2061·2023-04-25 21:11
閱讀 2963·2021-09-30 09:47
閱讀 2271·2021-09-24 09:48
閱讀 4427·2021-08-23 09:43
閱讀 895·2019-08-30 15:54
閱讀 559·2019-08-28 18:01
閱讀 1397·2019-08-27 10:55
閱讀 588·2019-08-27 10:55