在经常读取大量的数值文件时 (比如深度学习训练数据), 可以考虑将数据存储为NumPy 格式, 然后直接使用 NumPy 去读取, 速度相比为转换前快很多.
NumPy 提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式或者文本格式。
二进制格式的文件又分为 NumPy 专用的格式化二进制类型和无格式类型。
1. 保存为二进制文件 (.npy / .npz)numpy.save
numpy.savez
numpy.savez_compressed
2. 保存到文本文件numpy.savetxt
numpy.loadtxt
tofile() 和 fromfile()
tofile() 将数组中的数据以二进制格式写进文件
tofile() 输出的数据不保存数组形状和元素类型等信息
fromfile() 函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改
>>> a = np.arange(0, 12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> a.shape = 3, 4
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a.tofile('a.bin')
>>> b = np.fromfile('a.bin', dtype=np.float) # 按照 float 类型读入数据
>>> b # 读入的数据是错误的
array([0.0e+000, 4.9e-324, 9.9e-324, 1.5e-323, 2.0e-323, 2.5e-323,
3.0e-323, 3.5e-323, 4.0e-323, 4.4e-323, 4.9e-323, 5.4e-323])
>>> a.dtype # 查看 a 的 dtype
dtype('int64')
>>> b = np.fromfile('a.bin', dtype=np.int64)
>>> b # 数据是一维的
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
>>> b.shape = 3, 4 # 按照 a 的 shape 修改 b 的 shape
>>> b
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
从上面的例子可以看出,在读入数据时:需要正确设置dtype参数,并修改数组的shape属性才能得到和原始数据一致的结果。无论数据的排列顺序是C语言格式还是Fortran语言格式,tofile()都统一使用C语言格式输出。此外如果指定了sep参数,则fromfile()和tofile()将以文本格式对数组进行输入输出。sep参数指定的是文本数据中数值的分隔符。
save() 和 load()
保存一个数组到一个二进制的文件中, 保存格式是 .npynumpy.save(file, arr, allow_