目录

0.为什么要使用numpy保存数据

1.保存为二进制文件(.npy/.npz)并读取

numpy.save和numpy.load

numpy.savez

numpy.savez_compressed

2.保存到文本文件

numpy.savetxt

numpy.loadtxt

numpy.genfromtxt

numpy.fromregex

numpy.fromfile和numpy.ndarray.tofile


0.为什么要使用numpy保存数据

目前,几乎所有的机器学习和深度学习算法的python包都支持numpy,比如sklearn和tensorflow等。使用numpy保存数据可以十分方便的被各种算法调用。

1.保存为二进制文件(.npy/.npz)并读取

numpy.save和numpy.load

保存一个数组到一个二进制的文件中,保存格式是.npy

参数介绍
numpy.save(file, arr, allow_pickle=True, fix_imports=True)

file:文件名/文件路径
arr:要存储的数组
allow_pickle:布尔值,允许使用Python pickles保存对象数组(可选参数,默认即可)
fix_imports:为了方便Pyhton2中读取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.npy',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, **kwds)

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.savez('save_xy.npz',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.npy',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一致,用法完成一样.

2.保存到文本文件

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:使用默认参数

使用

>>> 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.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:数据行之间的分隔符
skiprows:跳过最前面的几行,默认为0
usecols:选择要读取的列,例usecols=(1,2,5),选取第2、3和6列的数据
unpack:数组是否转置,默认是false,不转置
ndim:指定数组的维度,即列数,默认为0,即不指定
encoding:编码方式,默认为‘bytes’

使用

np.loadtxt('test.out') 
np.loadtxt('test2.out', delimiter=',')

 

numpy.genfromtxt

从文本文件加载数据,并按指定的方式处理缺失值.

参数介绍

numpy.genfromtxt(fname, dtype=<class'float'>, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')

fname:文件名/文件路径,如果文件后缀是.gz.bz2,文件将被解压,然后再载入
dtype:要读取的数据类型
comments:文件头部或者尾部字符串的开头字符,用于识别头部,尾部字符串
delimiter:划分读取上来值的字符串
skiprows:跳过最前面的几行,默认为0,numpy的1.10中该参数已被移除,请使用skip_header
skip_header:同上
skip_footer:跳过最后面的几行,默认为0
converters:将列数据转换为值的一组函数。转换器还可以用于为丢失的数据提供默认  值:converters = {3: lambda s: float(s or 0)}
missing:numpy的1.10中该参数已被移除,请使用missing_value
missing_value:与缺失数据相对应的字符串集
filling_values:用来填充缺失值的集合
secols:选择要读取的列,例usecols=(1,2,5),选取第2、3和6列的数据
.......后面不常用的就不写了

使用

>>> from io import StringIO
>>> import numpy as np
>>> s = StringIO(u"1,1.3,abcde")
>>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
... ('mystring','S5')], delimiter=",")
>>> data
array((1, 1.3, 'abcde'),
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', '|S5')])

 

numpy.fromregex

从文本文件加载数据,并按指定的方式处理缺失值.

参数介绍

numpy.fromregex(fileregexpdtypeencoding=None)

file:要读取的文件名
regexp:用于解析文件的正则表达式。正则表达式中的组对应于dtype中的字段
dtype:要读取的数据类型
encoding:编码方式

使用

>>> f = open('test.dat', 'w')
>>> f.write("1312 foo\n1534  bar\n444   qux")
>>> f.close()
>>> regexp = r"(\d+)\s+(...)"  # match [digits, whitespace, anything]
>>> output = np.fromregex('test.dat', regexp,
...                       [('num', np.int64), ('key', 'S3')])
>>> output
array([(1312L, 'foo'), (1534L, 'bar'), (444L, 'qux')],
      dtype=[('num', '<i8'), ('key', '|S3')])
>>> output['num']
array([1312, 1534,  444], dtype=int64)

numpy.fromfile和numpy.ndarray.tofile

参数介绍

numpy.fromfile(filedtype=float, count=-1,sep='')

file:要读取的文件名
dtype:要读取的数据类型,默认‘float’file:要读取的文件名
count:要读取的条目数,默认为-1,即全部读取
sep:条目间的分隔符

参数介绍

numpy.ndarry.tofile(fid, format='%s')

fid:要存储的文件名
sep:条目间的分隔符
format:格式化输出