请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 40137|回复: 36

[经验总结] 【原创】我的python学习历程(一、数据读取与存储)

  [复制链接]

新浪微博达人勋

发表于 2013-11-29 20:24:15 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 阿阿飞飞 于 2013-11-29 22:11 编辑

        上篇学习历程写完后,由于太忙,且工作电脑不连网,不能及时把平时一些学习经验发上来共享,临近年底,终于稍有闲暇,后面将抽时间把积累的一些经验发上来与大家交流学习。
        这篇主要介绍下python的数据读取与存储,比较常用的按行读取这里就不细说了,可以参见
Vamei的博客http://www.cnblogs.com/vamei/archive/2012/09/16/2687954.html,里面有涉及到按行读取,分割字符串,然后存储为列表。这篇主要介绍numpy的整块数据的读取与存储。
        进行以下操作前先导入numpy:
  1. import numpy as np
复制代码

(1)二进制文件读取
        这里主要针对整块数据的二进制文件,例如一个仅包含风场U分量要素的二进制文件“U.bin”,维数为:360*181*43(注:x*y*t,即全球1*1度分辨率,43个时次)
  1. data=np.fromfile('U.bin',dtype=np.float32)
复制代码

        其中dtype设置最为关键,要根据数据类型进行设置,如这个例子里,设置成dtype=np.float读取出来的结果就不对,看结果是否正确,print data.shape,即可看到所读取出来的数据维数,看与实际数据维数是否匹配,不匹配就需要重新设置dtype。
读取完后,是用reshape还原维数:
  1. data=data.reshape(43,181,360)
复制代码

        注:由于python与matlab一样,为按行排列数据,所以还原维数时要注意次序,尤其IDL用户,因为在IDL读取出来的结构是(360,181,43)。
(2)文本文件读取
        同样以U分量风场为例,假设上面的“U.bin”已经被写成记事本可以打开的txt文件“U.txt”(怎么写的?见第(4)步)
  1. data=np.fromfile('U.txt',sep=' ',count=361*181*43,dtype=np.float32)
复制代码

        其中sep为文本文件的分隔方式,这里为空格,根据实际情况设置;count为数据量,即数据总个数;dtype也要与原数据一致,担心设错?多试两次!
  1. data=data.reshape(43,181,360)
复制代码

        这里再用一种字典(dict)的存储方式来保存:
        wdata={}  #定义字典存储多维数组,这里字典的每个元素即为一个时次的U,即data:181*360,共43个元素

  1. fr=open('U.txt','rb') #打开要读取的文件
  2. for i in np.arange(43):
  3.     wdata=np.fromfile(fr,sep=' ',count=361*181,dtype=np.float32)
  4. fr.close()
复制代码

(3)二进制文件的存储
   

  1. data.tofile('U.bin')
  2. #不加参数默认输出为二进制格式,也可以设置sep(分隔符)和fmt(格式)输出成文本格式
复制代码

(4)文本文件的存储
        使用np.savetxt可以存储变量为文本文件,但需要注意的是只适用于二维数组:
        如data为181*360的二维数组


  1. np.savetxt('U0.txt',data,fmt='%8.2f',delimiter='')  
  2. #因这里写出的文件仅一个时次的U,所以以'U0.txt'命名。delimiter为空字符'',不包含空格
复制代码

        针对(2)中的三维数据,需要分块存储,这也是为什么(2)中多提到一种字典存储方式的原因。
对(2)中的wdata进行存储:

  1. tLev=43 #设置时间维数
  2. fw=open('U.txt','wb') #打开一个空文件
  3. for w,t in zip(wdata,tLev):
  4.     np.savetxt(fw,wdata[w].reshape(181,360),fmt='%8.2f',delimiter='')
  5. fw.close()
复制代码

注:根据想要规定的数据格式设定fmt,规定数据位数和小数保留位数;这里delimiter设置为空字符'',否则默认为空格,会导致自定义的fmt数据格式错位。

个人经验,如有错误,请大家批评指正。
下一篇预告:精美地图的绘制

评分

参与人数 3金钱 +45 贡献 +12 收起 理由
ztftom + 10 + 5 不错!继续哦!
mofangbao + 15 + 5
言深深 + 20 + 2 楼主都是年底才有时间的啊!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-29 20:55:24 | 显示全部楼层
支持原创,楼主加油
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-29 21:31:03 | 显示全部楼层
支持楼主,期待连载!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2013-11-30 00:27:30 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-30 10:07:46 | 显示全部楼层
期待接下来的帖子
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-11-30 13:07:51 | 显示全部楼层
学习啦,O(∩_∩)O谢谢分享!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-10 22:53:20 | 显示全部楼层
python语言功能很强大,运算速度也比软件快
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-21 17:42:22 | 显示全部楼层
支持楼主,我也准备学习python
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-22 02:31:02 | 显示全部楼层
特别期待的你绘图文章!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-22 02:31:40 | 显示全部楼层
如果多一个读写netcdf文件的,就更好了!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表