可以保存为二进制文件,也可以保存为文本文件:
- 保存为二进制文件(.npy / .npz)
numpy.save
numpy.savez
numpy.savez_compressed
- 保存到文本文件
numpy.savetxt
numpy.loadtxt
在经常性的读取大量的数值文件时(比如深度学习训练数据),可以考虑将数据存为Numpy格式,然后直接使用Numpy去读取,速度比转化前快很多。
保存为二进制文件(.npy / .npz)
numpy.save
numpy.save
# 保存一个数组到一个二进制文件中,保存格式为.np
numpy.save(file, #文件名/文件路径
arr, #要存储的数组
allow_pickle=True, #布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可)
fix_imports=True) #为了方便Python2中读取Python3保存的数据(可选参数,默认即可)
例子:
>>> import numpy as np
#生成数据
>>> x=np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#数据保存
>>> np.save('save_x',x)
#读取保存的数据
>>> np.load('save_x.npy')
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy.savez
这个同样是保存数组到一个二进制文件中,但是厉害的是,它可以保存多个数组到同一个文件,保存格式是.npz,它其实就是多个前面np.save保存的.npy,再通过打包的方式将这些文件归到一个文件上,不行你去解压.npz文件就知道了,里面就是保存的多个.npy
numpy.savez(file, #文件名/文件路径
*args, #要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名
**kwds #(可选参数,默认即可))
例子:
>>> import numpy as np
#生成数据
>>> x=np.arange(10)
>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> y=np.sin(x)
>>> y
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
#数据保存
>>> np.save('save_xy',x,y)
#读取保存的数据
>>> npzfile=np.load('save_xy.npz')
>>> npzfile #是一个对象,无法读取
<numpy.lib.npyio.NpzFile object at 0x7f63ce4c8860>
#按照组数默认的key进行访问
>>> npzfile['arr_0']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['arr_1']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
更加神奇的是,你可以不适用Numpy默认给数组的Key,而是自己给数组有意义的Key,这样就可以不用去猜测自己加载数据是否是自己需要的.
#数据保存
>>> np.savez('newsave_xy',x=x,y=y)
#读取保存的数据
>>> npzfile=np.load('newsave_xy.npz')
#按照保存时设定组数key进行访问
>>> npzfile['x']
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> npzfile['y']
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
简直不能太爽,深度学习中,有时候你保存了训练集,验证集,测试集,还包括他们的标签,用这个方式存储起来,要啥加载啥,文件数量大大减少,也不会到处改文件名去.
numpy.savez_compressed
这个就是在前面numpy.savez的基础上加了压缩,前面我介绍时尤其注明numpy.savez是得到的文件打包,不压缩的.这个文件就是对文件进行打包时使用了压缩,可以理解为压缩前各npy的文件大小不变,使用该函数比前面的numpy.savez得到的npz文件更小.
注:函数所需参数和numpy.savez一致,用法完成一样.
保存到文本文件
numpy.savetxt
numpy.savetxt(fname, #文件名/文件路径,如果文件后缀是.gz,文件将被自动保存为.gzip格式,np.loadtxt可以识别该格式
X, #要存储的1D或2D数组
fmt='%.18e', #控制数据存储的格式
delimiter=' ', #数据列之间的分隔符
newline='\n', #数据行之间的分隔符
header='', #文件头步写入的字符串
footer='', #文件底部写入的字符串
comments='#', #文件头部或者尾部字符串的开头字符,默认是'#'
encoding=None) #使用默认参数
例子:
>>> import numpy as np
#生成数据
>>> x = y = z = np.ones((2,3))
>>> x
array([[1., 1., 1.],
[1., 1., 1.]])
#保存数据
np.savetxt('test.out', x)
np.savetxt('test1.out', x,fmt='%1.4e')
np.savetxt('test2.out', x, delimiter=',')
np.savetxt('test3.out', x,newline='a')
np.savetxt('test4.out', x,delimiter=',',newline='a')
np.savetxt('test5.out', x,delimiter=',',header='abc')
np.savetxt('test6.out', x,delimiter=',',footer='abc')
numpy.loadtxt
numpy.laodtxt(fname, #文件名/文件路径,如果文件后缀是.gz或.bz2,文件将被解压,然后再载入
dtype, #要读取的数据类型
comments='#', #文件头部或者尾部字符串的开头字符,用于识别头部,尾部字符串
delimiter=None, #划分读取上来值的字符串
converters=None, #数据行之间的分隔符
skiprows=0,
usecols=None,
unpack=False,
ndmin=0,
encoding='bytes')
例子:
np.loadtxt('test.out')
np.loadtxt('test2.out', delimiter=',')