本文簡要介紹 python 語言中 numpy.memmap
的用法。
用法:
class numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')
創建到存儲在磁盤上的二進製文件中的數組的內存映射。
Memory-mapped 文件用於訪問磁盤上大文件的小片段,而不將整個文件讀入內存。 NumPy 的 memmap 是類似數組的對象。這與 Python 的
mmap
模塊不同,後者使用 file-like 對象。ndarray 的這個子類與某些操作有一些不愉快的交互,因為它不太適合作為子類。使用此子類的另一種方法是自己創建
mmap
對象,然後使用 ndarray.__new__ 直接創建一個 ndarray,傳遞在其“buffer=”參數中創建的對象。這個類在某些時候可能會變成一個工廠函數,它將視圖返回到 mmap 緩衝區。
刷新 memmap 實例以將更改寫入文件。目前沒有 API 可以關閉底層
mmap
。確保資源實際關閉是很棘手的,因為它可能在不同的 memmap 實例之間共享。- filename: str、file-like 對象或 pathlib.Path 實例
用作數組數據緩衝區的文件名或文件對象。
- dtype: 數據類型,可選
用於解釋文件內容的數據類型。默認為
uint8
。- mode: {‘r+’,‘r’,‘w+’,‘c’},可選
文件以這種模式打開:
‘r’
以隻讀方式打開現有文件。
‘r+’
打開現有文件進行讀寫。
‘w+’
創建或覆蓋現有文件以進行讀寫。
‘c’
Copy-on-write:分配影響內存中的數據,但更改不會保存到磁盤。磁盤上的文件是隻讀的。
默認為“r+”。
- offset: 整數,可選
在文件中,數組數據從此偏移量開始。自從抵消以字節為單位,通常應為 byte-size 的倍數numpy.dtype.什麽時候
mode != 'r'
,即使超出文件末尾的正偏移量也是有效的;該文件將擴展以容納附加數據。默認情況下,memmap
將從文件的開頭開始,即使filename
是一個文件指針fp
和fp.tell() != 0
.- shape: 元組,可選
所需的陣列形狀。如果
mode == 'r'
以及之後的剩餘字節數抵消不是 byte-size 的倍數numpy.dtype,您必須指定numpy.shape。默認情況下,返回的數組將為一維數組,元素數量由文件大小和數據類型確定。- order: {‘C’, ‘F’},可選
指定 ndarray 內存布局的順序:行優先、C 風格或列優先、Fortran-style。僅當形狀大於一維時這才有效。默認順序是“C”。
參數:
注意:
memmap 對象可以在任何接受 ndarray 的地方使用。給定一個 memmap
fp
,isinstance(fp, numpy.ndarray)
返回True
。Memory-mapped 文件在 32 位係統上不能大於 2GB。
當 memmap 導致創建或擴展文件超出文件係統中的當前大小時,未指定新部分的內容。在具有 POSIX 文件係統語義的係統上,擴展部分將用零字節填充。
例子:
>>> data = np.arange(12, dtype='float32') >>> data.resize((3,4))
此示例使用臨時文件,因此 doctest 不會將文件寫入您的目錄。您將使用 ‘normal’ 文件名。
>>> from tempfile import mkdtemp >>> import os.path as path >>> filename = path.join(mkdtemp(), 'newfile.dat')
創建一個與我們的數據匹配的 dtype 和 shape 的 memmap:
>>> fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4)) >>> fp memmap([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], dtype=float32)
將數據寫入 memmap 數組:
>>> fp[:] = data[:] >>> fp memmap([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], dtype=float32)
>>> fp.filename == path.abspath(filename) True
將內存更改刷新到磁盤以將其讀回
>>> fp.flush()
加載 memmap 並驗證數據是否已存儲:
>>> newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4)) >>> newfp memmap([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], dtype=float32)
隻讀內存映射:
>>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4)) >>> fpr.flags.writeable False
Copy-on-write 內存映射:
>>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4)) >>> fpc.flags.writeable True
可以分配給 copy-on-write 數組,但值僅寫入數組的內存副本,而不寫入磁盤:
>>> fpc memmap([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], dtype=float32) >>> fpc[0,:] = 0 >>> fpc memmap([[ 0., 0., 0., 0.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], dtype=float32)
磁盤上的文件未更改:
>>> fpr memmap([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]], dtype=float32)
偏移到 memmap 中:
>>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16) >>> fpo memmap([ 4., 5., 6., 7., 8., 9., 10., 11.], dtype=float32)
- filename: str 或 pathlib.Path 實例
映射文件的路徑。
- offset: int
文件中的偏移位置。
- mode: str
文件模式。
屬性:
相關用法
- Python numpy median用法及代碼示例
- Python numpy.meshgrid用法及代碼示例
- Python numpy mean用法及代碼示例
- Python numpy ma.indices用法及代碼示例
- Python numpy matrix.A1用法及代碼示例
- Python numpy ma.zeros用法及代碼示例
- Python numpy matrix.T用法及代碼示例
- Python numpy matrix.I用法及代碼示例
- Python numpy ma.diff用法及代碼示例
- Python numpy mat用法及代碼示例
- Python numpy ma.mask_rowcols用法及代碼示例
- Python numpy ma.where用法及代碼示例
- Python numpy ma.zeros_like用法及代碼示例
- Python numpy mgrid用法及代碼示例
- Python numpy ma.notmasked_contiguous用法及代碼示例
- Python numpy ma.concatenate用法及代碼示例
- Python numpy ma.apply_along_axis用法及代碼示例
- Python numpy matrix.partition用法及代碼示例
- Python numpy ma.compress_rowcols用法及代碼示例
- Python numpy matrix.transpose用法及代碼示例
- Python numpy ma.vstack用法及代碼示例
- Python numpy ma.atleast_3d用法及代碼示例
- Python numpy ma.count用法及代碼示例
- Python numpy matrix.itemsize用法及代碼示例
- Python numpy ma.fix_invalid用法及代碼示例
注:本文由純淨天空篩選整理自numpy.org大神的英文原創作品 numpy.memmap。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。