numpy中的numpy.memmap函数的用法

版权声明:本文为博主原创文章,转载时须注明出处 https://blog.csdn.net/KID_yuan/article/details/89019384

定义:

numpy.memmap(filename,datatype[optional],mode[optional],offset[optional] ,shape[optional],order[optional])

功能:numpy模块功能,创建存储在磁盘二进制文件中的数组的内存映射。

参数:


filename(文件名):str、类似文件的对象或pathlib.path实例,用作数组数据缓冲区的文件名或文件对象。

datatype(数据类型):数据类型,可选,用于解释文件内容的数据类型。默认值为uint8。

mode(模式):'r+'、'r'、'r+'、'c',可选(默认为r+)

offset(字节偏移):在该文件中,数组数据从此偏移量开始。 由于偏移量是以字节为单位测量的,因此通常应该是dtype字节大小的倍数。 当模式!='r'时,甚至超出文件末尾的正偏移也是有效的; 该文件将被扩展以容纳附加数据。 默认情况下,memmap将从文件的开头开始,即使filename是文件指针fp和fp.tell()!= 0。

shape(形状): tuple,所需的阵列形状。 如果mode =='r'且offset之后的剩余字节数不是dtype的字节大小的倍数,则必须指定shape。 默认情况下,返回的数组将是1-D,元素数由文件大小和数据类型确定。

order(顺序):{'C', 'F'},

文件模式:

“r”:打开现有文件仅供读取。

“r+”:打开现有文件进行读写。

“w+”:创建或覆盖现有文件进行读写。

“c”写时复制:分配会影响内存中的数据,但更改不会保存到磁盘。磁盘上的文件是只读的。

举例:


from tempfile import mkdtemp
import os.path as path
import numpy as np

data=np.arange(12,dtype='float32')
data.resize(3,4)
filename = path.join(mkdtemp(),'newfile.dat')

fp = np.memmap(filename,dtype='float32',mode='w+',shape=(3,4))
#创建一个内存映射关系fp,数据为0.
fp#输出fp
Out[2]: 
memmap([[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]], dtype=float32)
fp[:] = data[:]
fp#输出fp
Out[4]: 
memmap([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]], dtype=float32)

fp.filename == path.abspath(filename)
Out[5]: True

del fp#删除fp
newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))
newfp
Out[8]: 
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
Out[10]: False#由于fpr为只读

fpc = np.memmap(filename, dtype='float32', mode='c', shape=(3,4))
fpc.flags.writeable
Out[12]: True
fpc
Out[13]: 
memmap([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.]], dtype=float32)

fpc[2,:] = 1
fpc
Out[15]: 
memmap([[0., 1., 2., 3.],
        [4., 5., 6., 7.],
        [1., 1., 1., 1.]], dtype=float32)

fpr#硬盘上的映射数据并没被改变
Out[16]: 
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#输出offset字节偏移后的数据
Out[18]: memmap([ 4.,  5.,  6.,  7.,  8.,  9., 10., 11.], dtype=float32)

参考翻译自:

numpy.memmap:https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

猜你喜欢

转载自blog.csdn.net/KID_yuan/article/details/89019384