Python编程基础与科学计算
上QQ阅读APP看书,第一时间看更新

5.1.7 数组的保存与读取

在科学计算中,数组记录的数据量通常非常巨大,而且在计算过程中也会生成许多中间结果,如果将这些结果都保存到内存中,势必会占用太多的内存空间,因此需要把一些数据保存在硬盘的文件中。数组可以保存到文本文件中,也可以保存到二进制文件或压缩二进制文件中。

1.文本文件的读写

将数组保存到文本文件中和从文本文件读取数据的函数分别是savetxt()函数和loadtxt()函数。savetxt()函数的格式如下所示:

     savetxt(fname,X,fmt='%.18e',delimiter='',newline='\n',header='',footer='',comments='#',
encoding=None)

其中各参数的意义如表5-6所示。

表5-6 savetxt()函数各参数的意义

loadtxt()函数从文本文件中读取数据,并生成数组,文本文件的每行必须有相同数量的数值。loadtxt()函数的格式如下所示:

     loadtxt(fname,dtype=float,comments='#',delimiter=None,converters=None,skiprows=0,
usecols=None,unpack=False,ndmin=0,encoding='bytes',max_rows=None)

loadtxt()函数各参数的意义如表5-7所示。

表5-7 loadtxt()函数各参数的意义

下面的程序计算方程确定的函数值,将值写入到z.out文件中,从该文件中重新读取数据,并输出数据。

2.二进制文件的读写

NumPy中保存数组到二进制文件的函数有save()、savez()和savez_compressed(),其中save()函数将一个数组保存到二进制文件.npy中,savez()函数将多个数组保存到非压缩二进制文件.npz中,savez_compressed()函数将多个数组以压缩方式保存到二进制文件. npz中。这三个函数的格式如下所示。

     save(file,arr,allow_pickle=True,fix_imports=True)
savez(file,*args,**kwds)
savez_compressed(file,*args,**kwds)

其中,file是要保存的路径和文件名;arr是数组名;allow_pickle设置运行时是否使用Python的pickle模块的功能,pickle可以将数组对象序列化后直接保存到文件中;fix_ imports用于将Python3的对象可以在Python2中序列化,并在Python2中可读;如果用*args指定多个数组来保存数据,在文件中用名称arr_0、arr_1、……存储对应的数组名;如果用**kwds指定多个数组保存数据,在文件中用对应的关键字来存储,关键字由用户自己指定。

NumPy读取二进制文件的函数是load(),load()函数可以读取.npy和.npz文件,其格式如下所示。

     load(file,mmap_mode=None,allow_pickle=False,fix_imports=True)

其中,file是路径和文件名,或者其他读写设备;mmap_mode设置内存映射模式,可以取None、'r+'(打开文件可读写)、'r'(打开文件只读)、'w+'(新建或覆盖文件可读写)或'c'(复制文件,原文件只读),内存映射保存到磁盘上,可以像数组一样进行切片。如果load()函数打开的是.npy文件,则返回值是一个数组;如果load()函数打开的是.npz文件,则返回值是一个字典,字典的值是数组。

下面的代码是用不同的方式保存数组到二进制文件中,并打开二进制文件读取数据。