Numpy 中数据的常用的保存与读取方法
在经常性读取大量的数值文件时 (比如深度学习训练数据), 可以考虑现将数据存储为 Numpy 格式,然后直接使用 Numpy 去读取,速度相比为转化前快很多.
下面就常用的保存数据到二进制文件和保存数据到文本文件进行介绍:
保存为二进制文件 (.npy/.npz)
numpy.save
保存一个数组到一个二进制的文件中,保存格式是.npy
参数介绍
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
file: 文件名 / 文件路径
arr: 要存储的数组
allow_pickle: 布尔值,允许使用 Python pickles 保存对象数组 (可选参数,默认即可)
fix_imports: 为了方便 Pyhton2 中读取 Python3 保存的数据 (可选参数,默认即可)
使用
1 | >>> import numpy as np |
numpy.savez
这个同样是保存数组到一个二进制的文件中,但是厉害的是,它可以保存多个数组到同一个文件中,保存格式是.npz
, 它其实就是多个前面 np.save 的保存的 npy
, 再通过打包 (未压缩) 的方式把这些文件归到一个文件上,不行你去解压 npz
文件就知道了,里面是就是自己保存的多个 npy
.
参数介绍
numpy.savez(file, *args, **kwds)
file: 文件名 / 文件路径
*args: 要存储的数组,可以写多个,如果没有给数组指定 Key,Numpy 将默认从’arr_0’,'arr_1’的方式命名
kwds:(可选参数,默认即可)
使用
1 | >>> import numpy as np |
更加神奇的是,你可以不适用 Numpy 默认给数组的 Key, 而是自己给数组有意义的 Key, 这样就可以不用去猜测自己加载数据是否是自己需要的.
1 | #数据保存 |
简直不能太爽,深度学习中,有时候你保存了训练集,验证集,测试集,还包括他们的标签,用这个方式存储起来,要啥加载啥,文件数量大大减少,也不会到处改文件名去.
numpy.savez_compressed
这个就是在前面 numpy.savez 的基础上加了压缩,前面我介绍时尤其注明 numpy.savez 是得到的文件打包,不压缩的。这个文件就是对文件进行打包时使用了压缩,可以理解为压缩前各 npy
的文件大小不变,使用该函数比前面的 numpy.savez 得到的 npz
文件更小.
注:函数所需参数和 numpy.savez 一致,用法完成一样.
保存到文本文件
numpy.savetxt
保存数组到文本文件上,可以直接打开查看文件里面的内容.
参数介绍
numpy.savetxt(fname, X, fmt=‘%.18e’, delimiter=’ ‘, newline=’\n’, header=‘’, footer=‘’, comments='# ', encoding=None)
fname: 文件名 / 文件路径,如果文件后缀是
.gz
, 文件将被自动保存为.gzip
格式,np.loadtxt 可以识别该格式
X: 要存储的 1D 或 2D 数组
fmt: 控制数据存储的格式
delimiter: 数据列之间的分隔符
newline: 数据行之间的分隔符
header: 文件头步写入的字符串
footer: 文件底部写入的字符串
comments: 文件头部或者尾部字符串的开头字符,默认是’#’
encoding: 使用默认参数
使用
1 | >>> import numpy as np |
保存下来的文件都是友好的,可以直接打开看看有什么变化.
numpy.loadtxt
根据前面定制的保存格式,相应的加载数据的函数也得变化.
参数介绍
numpy.loadtxt(fname, dtype=<class ‘float’>, comments=‘#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’)
fname: 文件名 / 文件路径,如果文件后缀是
.gz
或.bz2
, 文件将被解压,然后再载入
dtype: 要读取的数据类型
comments: 文件头部或者尾部字符串的开头字符,用于识别头部,尾部字符串
delimiter: 划分读取上来值的字符串
converters: 数据行之间的分隔符
… 后面不常用的就不写了
使用
1 | np.loadtxt('test.out') |
参考资料:
官方 API-Routines