- 积分
- 688
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-2-7
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 阿阿飞飞 于 2013-11-29 22:11 编辑
上篇学习历程写完后,由于太忙,且工作电脑不连网,不能及时把平时一些学习经验发上来共享,临近年底,终于稍有闲暇,后面将抽时间把积累的一些经验发上来与大家交流学习。
这篇主要介绍下python的数据读取与存储,比较常用的按行读取这里就不细说了,可以参见
Vamei的博客http://www.cnblogs.com/vamei/archive/2012/09/16/2687954.html,里面有涉及到按行读取,分割字符串,然后存储为列表。这篇主要介绍numpy的整块数据的读取与存储。
进行以下操作前先导入numpy:
(1)二进制文件读取
这里主要针对整块数据的二进制文件,例如一个仅包含风场U分量要素的二进制文件“U.bin”,维数为:360*181*43(注:x*y*t,即全球1*1度分辨率,43个时次)
- data=np.fromfile('U.bin',dtype=np.float32)
复制代码
其中dtype设置最为关键,要根据数据类型进行设置,如这个例子里,设置成dtype=np.float读取出来的结果就不对,看结果是否正确,print data.shape,即可看到所读取出来的数据维数,看与实际数据维数是否匹配,不匹配就需要重新设置dtype。
读取完后,是用reshape还原维数:
- data=data.reshape(43,181,360)
复制代码
注:由于python与matlab一样,为按行排列数据,所以还原维数时要注意次序,尤其IDL用户,因为在IDL读取出来的结构是(360,181,43)。
(2)文本文件读取
同样以U分量风场为例,假设上面的“U.bin”已经被写成记事本可以打开的txt文件“U.txt”(怎么写的?见第(4)步)
- data=np.fromfile('U.txt',sep=' ',count=361*181*43,dtype=np.float32)
复制代码
其中sep为文本文件的分隔方式,这里为空格,根据实际情况设置;count为数据量,即数据总个数;dtype也要与原数据一致,担心设错?多试两次!
- data=data.reshape(43,181,360)
复制代码
这里再用一种字典(dict)的存储方式来保存:
wdata={} #定义字典存储多维数组,这里字典的每个元素即为一个时次的U,即data:181*360,共43个元素
- fr=open('U.txt','rb') #打开要读取的文件
- for i in np.arange(43):
- wdata=np.fromfile(fr,sep=' ',count=361*181,dtype=np.float32)
- fr.close()
复制代码
(3)二进制文件的存储
- data.tofile('U.bin')
- #不加参数默认输出为二进制格式,也可以设置sep(分隔符)和fmt(格式)输出成文本格式
复制代码
(4)文本文件的存储
使用np.savetxt可以存储变量为文本文件,但需要注意的是只适用于二维数组:
如data为181*360的二维数组
- np.savetxt('U0.txt',data,fmt='%8.2f',delimiter='')
- #因这里写出的文件仅一个时次的U,所以以'U0.txt'命名。delimiter为空字符'',不包含空格
复制代码
针对(2)中的三维数据,需要分块存储,这也是为什么(2)中多提到一种字典存储方式的原因。
对(2)中的wdata进行存储:
- tLev=43 #设置时间维数
- fw=open('U.txt','wb') #打开一个空文件
- for w,t in zip(wdata,tLev):
- np.savetxt(fw,wdata[w].reshape(181,360),fmt='%8.2f',delimiter='')
- fw.close()
复制代码
注:根据想要规定的数据格式设定fmt,规定数据位数和小数保留位数;这里delimiter设置为空字符'',否则默认为空格,会导致自定义的fmt数据格式错位。
个人经验,如有错误,请大家批评指正。
下一篇预告:精美地图的绘制
|
评分
-
查看全部评分
|