爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12230|回复: 9

[求助] 读取EC Reanalysis数据并计算时发生死机

[复制链接]

新浪微博达人勋

发表于 2018-7-11 16:36:27 | 显示全部楼层 |阅读模式

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

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

x
    想从EC Reanalysis读取变量做一些计算,比如通过T和RH计算Td。数据集为27层等压面,0.25*0.25度,中国西南地区各要素,单个要素的shape(time,level,lon,lat):(612, 27, 81, 121),程序如下(Td计算公式只是个示例,想试试数组和标量是否可以直接运算,因为numpy有broadcast这一功能):
  1. import numpy as np
  2. from netCDF4 import Dataset
  3. ncfile='F:\\2018\\ECReanalysis\\interim2014-05-09.nc'
  4. f=Dataset(ncfile,'r')
  5. t=f.variables['t']
  6. T=6.112*np.exp((t-263.15)/t)
复制代码
得到报错为:
Traceback (most recent call last):

  File "<ipython-input-2-1e9334c64d98>", line 1, in <module>
    runfile('F:/2018/ShortTimeRainForecast.py', wdir='F:/2018')

  File "D:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 880, in runfile
    execfile(filename, namespace)

  File "D:\Anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "F:/2018/ShortTimeRainForecast.py", line 24, in <module>
    T=6.112*np.exp((t-263.15)/t)

TypeError: unsupported operand type(s) for -: 'netCDF4._netCDF4.Variable' and 'float'

说明t是netCDF4._netCDF4.Variable数据类型,不支持numpy的broadcast。
那么试一试把t转成numpy.ndarray:
  1. import numpy as np
  2. from netCDF4 import Dataset
  3. ncfile='F:\\2018\\ECReanalysis\\interim2014-05-09.nc'
  4. f=Dataset(ncfile,'r')
  5. T=np.asarray(f['t'])
复制代码
直接死机,照说(612, 27, 81, 121)这种数据量应该也不算特别大吧。不知道谁有合适的办法,以及netCDF4._netCDF4.Variable这种数据类型该如何处置,谢谢解答!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-11 16:43:07 | 显示全部楼层
后来试了下,一次少转换一点,比如只取一个时次或者一个层次,用np.asarray()还是没问题的,但是一次性全部转换就不行了,不知道有没有办法可以一步到位
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-13 12:30:14 | 显示全部楼层
schliezer 发表于 2018-7-11 16:43
后来试了下,一次少转换一点,比如只取一个时次或者一个层次,用np.asarray()还是没问题的,但是一次性全部 ...

能用.shape获取维数信息么 可以的话折衷一下写个循环再合并吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-17 08:55:22 | 显示全部楼层
我不知道叫什么 发表于 2018-7-13 12:30
能用.shape获取维数信息么 可以的话折衷一下写个循环再合并吧

谢谢,也只能这样了,一次只转换一个时次,对时间做循环
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-30 10:02:08 | 显示全部楼层
schliezer 发表于 2018-7-17 08:55
谢谢,也只能这样了,一次只转换一个时次,对时间做循环

请问一次怎么读取一个层次的数据啊?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-31 17:10:08 | 显示全部楼层
kust 发表于 2018-7-30 10:02
请问一次怎么读取一个层次的数据啊?

lev=np.asarray(f.variables['level'])
t850=np.asarray(f['t'][i,lev==850,:,:])-273.15
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-1 15:23:49 | 显示全部楼层
schliezer 发表于 2018-7-31 17:10
lev=np.asarray(f.variables['level'])
t850=np.asarray(f['t'])-273.15

这样好象不行,我换了个方式读出来了,想计算各层的差值或者和,总是写不对,新手小白一枚
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-1 15:45:34 | 显示全部楼层
kust 发表于 2018-8-1 15:23
这样好象不行,我换了个方式读出来了,想计算各层的差值或者和,总是写不对,新手小白一枚

单层相加可以,做循环相加所有高度层(14层)写循环出错。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-8-3 08:43:47 | 显示全部楼层
kust 发表于 2018-8-1 15:45
单层相加可以,做循环相加所有高度层(14层)写循环出错。。

我也是新手。循环相加可能数据量太大?听你描述,你可能是要求水汽通量,可降水量类似的积分量,你看scipy或者metpy里面有没有提供积分函数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-3 15:43:35 | 显示全部楼层
schliezer 发表于 2018-8-3 08:43
我也是新手。循环相加可能数据量太大?听你描述,你可能是要求水汽通量,可降水量类似的积分量,你看scip ...

好的  
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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