numpy.memmap#
- class numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C')[源代码]#
创建一个内存映射到存储在磁盘上的*二进制*文件中的数组.
内存映射文件用于访问磁盘上大文件的小段,无需将整个文件读入内存.NumPy 的 memmap 是类似数组的对象.这与 Python 的
mmap
模块不同,后者使用类似文件的对象.这个 ndarray 的子类在某些操作中存在一些不愉快的交互,因为它作为子类并不完全合适.使用这个子类的替代方法是自行创建
mmap
对象,然后使用 ndarray.__new__ 直接创建一个 ndarray,在其 ‘buffer=’ 参数中传递创建的对象.这个类可能在某个时候会被转换成一个工厂函数,该函数返回一个 mmap 缓冲区的视图.
刷新 memmap 实例以将更改写入文件.目前没有 API 来关闭底层的
mmap
.确保资源实际上已关闭是棘手的,因为它可能在不同的 memmap 实例之间共享.- 参数:
- filenamestr, 类文件对象, 或 pathlib.Path 实例
用作数组数据缓冲区的文件名或文件对象.
- dtype数据类型, 可选
用于解释文件内容的数据类型.默认是
uint8
.- mode{‘r+’, ‘r’, ‘w+’, ‘c’}, 可选
文件以这种模式打开:
‘r’
打开现有文件以只读方式.
‘r+’
打开现有文件以进行读写.
‘w+’
创建或覆盖现有文件以进行读写.如果
mode == 'w+'
那么shape
也必须指定.‘c’
写时复制:赋值会影响内存中的数据,但更改不会保存到磁盘.磁盘上的文件是只读的.
默认是 ‘r+’.
- offsetint, 可选
在文件中,数组数据从这个偏移量开始.由于 offset 是以字节为单位测量的,它通常应该是
dtype
字节大小的倍数.当mode != 'r'
时,即使文件末尾之外的正偏移量也是有效的;文件将被扩展以容纳额外的数据.默认情况下,即使filename
是一个文件指针fp
且fp.tell() != 0
,``memmap`` 也会从文件的开头开始.- shape整数或整数序列,可选
数组的期望形状.如果
mode == 'r'
并且 offset 之后的剩余字节数不是dtype
字节大小的倍数,则必须指定shape
.默认情况下,返回的数组将是 1-D 的,元素数量由文件大小和数据类型决定.在 2.0 版本发生变更: 形状参数现在可以是任何整数序列类型,以前类型仅限于元组和整数.
- order{‘C’, ‘F’}, 可选
指定 ndarray 内存布局的顺序:行优先,C 风格或 列优先,Fortran 风格. 这仅在形状大于 1-D 时有效果. 默认顺序是 ‘C’.
参见
lib.format.open_memmap
创建或加载一个内存映射的
.npy
文件.
备注
memmap 对象可以在任何接受 ndarray 的地方使用.给定一个 memmap
fp
,``isinstance(fp, numpy.ndarray)`` 返回True
.在32位系统上,内存映射文件不能大于2GB.
当一个内存映射导致文件在文件系统中被创建或扩展到超出其当前大小时,新部分的内容未指定.在具有 POSIX 文件系统语义的系统上,扩展部分将用零字节填充.
示例
>>> import numpy as np >>> data = np.arange(12, dtype='float32') >>> data.resize((3,4))
这个例子使用了一个临时文件,这样 doctest 不会将文件写入你的目录.你会使用一个 ‘正常’ 的文件名.
>>> from tempfile import mkdtemp >>> import os.path as path >>> filename = path.join(mkdtemp(), 'newfile.dat')
创建一个与我们的数据类型和形状匹配的内存映射:
>>> 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)
只读 memmap:
>>> fpr = np.memmap(filename, dtype='float32', mode='r', shape=(3,4)) >>> fpr.flags.writeable False
写时复制内存映射:
>>> fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4)) >>> fpc.flags.writeable True
可以对写时复制数组进行赋值,但值仅写入数组的内存副本,不会写入磁盘:
>>> 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)
内存映射的偏移量:
>>> fpo = np.memmap(filename, dtype='float32', mode='r', offset=16) >>> fpo memmap([ 4., 5., 6., 7., 8., 9., 10., 11.], dtype=float32)
- 属性:
- filenamestr 或 pathlib.Path 实例
映射文件的路径.
- offsetint
文件中的偏移位置.
- modestr
文件模式.
方法
flush
()将数组中的任何更改写入磁盘上的文件.