@[云好晕啊]学习笔记
输入输出
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本次笔记是本人第一次学习写CSDN博客如有不好欢迎指正。这次的内容是通过numpy实现文件输入输出
提示:以下是本篇文章正文内容,下面案例可供参考
一、NumPy是什么?
NumpPy(Numerical Python)是一个开源的Python科学计算库,它是一个由多维数组对象和用于处理数组例程集合组成的库
二、实验过程
1.引入库
代码如下(示例):
import numpy as np
import DataTime
2.各种文件读取与存储
2.1二进制文件
save()、savez()和load()函数是以numpy专用的读写二进制文件的,它们具有自动处理数组元素类型和形状的功能。
save()函数保存之后的后缀名为npy。
savez()函数提供将多个数组存储至一个文件的能力,以二进制的方式存储文件;savez()函数保存后后缀名为npz,以压缩打包的方式存储文件,可以用压缩软件解压。使用解压程序后可以看到若干个以“数组名称”命名的NPY格式文件,数组名称默认为“arr_数字”的形式,同样可在savez()指定参数名称来命名数组。
load()函数用于加载这些二进制文件
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
-
file:文件名,以.npy扩展
-
array:数组变量
-
allow_pickle:接收boolean值,默认为True,表示允许序列化
-
fix_imports:接收boolean值,默认为True,表示返回一个序列化后的对象
numpy.savez(file, arr, allow_pickle=True, fix_imports=True)
-
本函数与save()函数参数基本相同,另外可以指定数组名称
numpy.load(file)
-
file:文件名,以.npy为扩展名,以.npz为压缩扩展名
代码如下(示例):
#使用load、save函数
outfile=r'.\test.npy'
#设置随机种子为20201123
np.random.seed(20201123)
#生成3行5列的均匀分布数组
x=np.random.uniform(0,1,[3,5])
#存储为2进制文件
np.save(outfile,x)
#加载二进制文件
y=np.load(outfile)
print(y)
#使用savez函数
outfile=r'.\test.npz'
#等距拆分为5段
x=np.linspace(0,np.pi,5)
y=np.sin(x)
z=np.cos(x)
np.savez(outfile,x,y,z_d=z)
data=np.load(outfile)
np.set_printoptions(suppress=True)
print(data.files)
结果分析
- 本次随机产生的数组数据
- 使用npz格式解压后的文件名
2.2文本文件
在numpy中,loadtxt()和savetxt()函数可以实现对文件后缀名为.txt和.csv文件进行读取操作。
2.2.1写入TXT或CSV文件
函数格式如下:
numpy.savetxt(fname,array,fmt='%.18e',delimeter=None,newline='\n',header=' ',footer=' ',comments='#',encoding=None)
-
fname:文件,字符串或产生器,可以使.gz或.bz2文件
-
array:存入文件数组
-
fmt:写入文件的格式,有%d,%.2f, %.18e,默认是%.18e
-
delimeter:分割符,默认是空格
-
newline:换行符
-
header:在文件开头写入的字符串
-
footer:在文件末尾写入的字符串
-
comments:添加在页眉页脚交的字符串注释标记,默认为“#”
-
encoding:输出文件编码格式
2.2.2读取TXT或CSV文件
函数格式如下:
numpy.loadtxt(fname,dtype=<type'float'>,fmt='%.18e',comments='#',delimeter=None,converters=None,skiprows=0,usecols=None,unpack=None,ndmin=0,encoding='bytes')
-
fname:文件,字符串或产生器,可以使.gz或.bz2文件
-
dtype:数据类型
-
delimeter:分割符,默认是空格
-
usecols:选取数据列,使用元组作为参数选取
-
unpack:如果为True,读入属性将写入不同的变量
-
comments:注释符,默认为‘#’
-
converters:转换器,数据列和转换函数之间的映射字典
-
skiprows:跳过第一行行数,默认为0
-
ndmin:返回数组至少具有ndmin维度,默认值为0还可选择1,2
-
encoding:用于解码输入文件的编码,默认为bytes。
2.2.3文本格式选项
函数格式如下:
numpy.set_printoptions(precision=None , threshold=None,edgeitems=None,linewidth=None,suppress=None,nanstr=None,infstr=None ,formatter=None,sign=None,floatmode=None,**kwarg) .
-
precision:设置浮点精度,控制输出的小数点个数,默认是8。
-
threshold∶概略显示,超过该值则以“.”的形式来表示,默认是1000。
-
linewidth :用于确定每行多少字符数后插入换行符,默认为75。
-
suppress :当suppress=True,表示小数不需要以科学计数法的形式输出,默认是False。
-
nanstr :浮点非数字的字符串表示形式,默认nan。
-
infstr :浮点无穷大的字符串表示形式,默认inf 。
2.2.4代码
#将时间转换为星期几
def datestr2num(s):
return datetime.datetime.strptime(s.decode('ascii'),"%Y-%m-%d").date().weekday()
#读取文本文档
date,total,people=np.loadtxt('sales.txt',delimiter=',',skiprows=0,unpack=True,usecols=(0,1,2),converters={0:datestr2num},
encoding='bytes')
print(date,'\n',total,'\n',people)
sum=np.array([date,total,people])
#保存为文本文档
np.savetxt('saleout.txt',sum,fmt='%d',delimiter=',',newline='\n',header='星期,流水,总人数',footer='end')
#文本文件格式选项
np.set_printoptions(precision=4)
x=np.array([1.23546])
print(x)
np.set_printoptions(threshold=20)
x=np.arange(30)
print(x)
np.set_printoptions(threshold=np.iinfo(np.int).max)
print(x)
eps=np.finfo(float).eps
x=np.arange(4.)
x=x**2-(x+eps)**2
print(x)
np.set_printoptions(suppress=True)
print(x)
np.set_printoptions(precision=2,suppress=True,threshold=5)
print(x)
#返回参数设置
x=np.get_printoptions()
print(x)
2.2.5 结果及其分析
- 本次读取的文本文档是一个星期的销量及人数文件,首先对于时间的格式我们需要转换为星期形式所以定义了一个转换函数来实现转换,其次读入的数据都是以‘,’作为分割符,使用不同属性赋值不同变量,不用跳过第一行,编码方式为bytes
- 写入该文件是以整型方式写入,添加了字符标题以及结尾字符,换行符是\n以及分割符是‘,’
- 参数设置结果显示
- 获取文本参数
2.3多维数据文件
在numpy中,tofile()和fromfile()可实现读写多维数据。
2.3.1写入多维数据文件
tofile()函数格式:
数组名.tofile(fid,sep='',format='%s')
- fid:文件、字符串
- sep:数据分割符,如果为空串,写入文件为二进制,即默认为空串
- format:写入数据格式,默认为str类型
2.3.2读取多维数据文件
fromfile()函数格式
numpy.fromfile(file,dtype=float,count=-1,sep='')
- file:文件、字符串
- dtype:读取数据类型。读取数据需要指定数据类型,默认为float
- count:读取元素个数,-1表示读入整个文件
- sep:数据分割符,如果是空串,写入二进制格式
2.3.3代码
#使用numpy读取多维数据
arr=np.arange(30).reshape(3,5,2)
arr.tofile('arr.dat',sep=',',format='%d')
arr1=np.fromfile('arr.dat',dtype=np.int32,sep=',').reshape((5,3,2))
print(arr1)
2.3.4 结果
- 输出结果
- 保存的文件
总结
本次是NumPy入门学习的第一课,自己收获很大很有意义的一次。首先自己学会了numpy中各种输入输出的操作,另外这篇博客是我第一篇博客,是一篇里程碑式的跨越,我相信每个人都能收获很大。