爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 755|回复: 2

[经验总结] 在metpy计算中避免循环

[复制链接]
发表于 2025-2-25 11:03:15 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一大碗年糕 于 2025-2-25 11:06 编辑

问题描述:metpy用的不是很多,昨天在计算一些物理量的时候发现在涉及dx,dy时
  1. dx, dy = mpcalc.lat_lon_grid_deltas(ds['longitude'], ds['latitude'])
  2. div = mpcalc.divergence(u, v, dx=dx, dy=dy)
复制代码
发现报错
  1. IndexError: too many indices for array: array is 2-dimensional, but 3 were indexed
复制代码

问题原因:涉及偏导的函数如散度mpcalc.divergence和涡度mpcalc.vorticity等时,dx, dy = mpcalc.lat_lon_grid_deltas(ds['longitude'], ds['latitude'])所返回的dx,dy和通常的多维数据3-D(time,lat,lon)或4-D(time,level,lat,lom)维度不匹配,而事实上mpcalc.divergence和mpcalc.vorticity是支持多维UV的,昨天在网上查了下很多教程在此都采用for循环time维和level维解决问题,然而这并不符合简洁计算的逻辑
解决办法一:在dx,dy前补上缺失维
  1. dx, dy = mpcalc.lat_lon_grid_deltas(ds['longitude'], ds['latitude'])
  2. dx = dx[None, :]
  3. dy = dy[None, :]
  4. div = mpcalc.divergence(u , v, dx=dx,dy=dy)
复制代码
解决办法二:使用grid_deltas_from_dataarray()直接从uv数据中获取dx,dy,避免自己生成
  1. dx, dy = metpy.xarray.grid_deltas_from_dataarray(u)
  2. div = mpcalc.divergence(u , v, dx=dx,dy=dy)
复制代码
注意该函数打包在metpy.xarray中而非metpy.calc

参考资料:

https://stackoverflow.com/questions/55007717/calculating-vorticity-for-multiple-vertical-levels-in-metpy


密码修改失败请联系微信:mofangbao
发表于 2025-2-25 20:32:44 | 显示全部楼层
硕硕yyds!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

 楼主| 发表于 2025-2-25 22:24:11 | 显示全部楼层

必须感谢我的python启蒙oly老师哈哈
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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