当处理大数组时,内存可能不够用。numpy 提供了一个函数 np.memmap() 让我们可以处理大数组。memmap = memory mapped
np.memmap() 可以读取大磁盘文件中的一小段到内存,所以它占内存较小
参数说明:
import numpy as np
from tempfile import mkdtemp # 用于创建临时文件夹,真实使用时可以指定自己的文件夹
import os
# 创建数组
data = np.arange(16, dtype='float32')
data.resize((4,4))
# 初始化可以写入数据的文件
filename = os.path.join(mkdtemp(), 'newfile.bin')
fpath = np.memmap(filename, dtype='float32', mode='w+', shape=(4,4))
fpath
>>>
memmap([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]], dtype=float32)
# 数组数据写入文件中
fpath[:] = data[:]
# 指定位置更新数据
fpath[0,0] = 100
# 将内存数据写到磁盘
fpath.flush()
print(fpath)
>>>
[[ 100. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]]
# 读取文件,记住需要指定dtype,不然会以默认的uint8读取数据
newfp = np.memmap(filename, dtype='float32', mode='r', shape=(4,4))
newfp
>>>
memmap([[ 100., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]], dtype=float32)
未指定 dtype 和 shape 会输出错误数据:
参考:
numpy.memmap
NumPy Input and Output: memmap() function
Pitfalls to avoid with np.memmap