Python MetPy中多个垂直面涡度的计算
我试图计算多个(连续的)垂直水平的梅比涡度。当我尝试为单个级别计算它时,一切正常 这是代码;我使用了来自的横截面示例 然后进行了涡度计算Python MetPy中多个垂直面涡度的计算,python,metpy,Python,Metpy,我试图计算多个(连续的)垂直水平的梅比涡度。当我尝试为单个级别计算它时,一切正常 这是代码;我使用了来自的横截面示例 然后进行了涡度计算 vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy) 回溯: Traceback (most recent call last): File "E:\Временные файлы\cross_section (1).py", line 63, in <module>
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)
回溯:
Traceback (most recent call last):
File "E:\Временные файлы\cross_section (1).py", line 63, in <module>
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\xarray.py", line 436, in wrapper
return func(*args, **kwargs)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\calc\kinematics.py", line 60, in wrapper
ret = func(*args, **kwargs)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\calc\kinematics.py", line 121, in vorticity
dudy = first_derivative(u, delta=dy, axis=-2)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\calc\tools.py", line 920, in wrapper
return preprocess_xarray(func)(f, **kwargs)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\xarray.py", line 436, in wrapper
return func(*args, **kwargs)
File "C:\ProgramData\Miniconda3\lib\site-packages\metpy\calc\tools.py", line 1014, in first_derivative
combined_delta = delta[tuple(delta_slice0)] + delta[tuple(delta_slice1)]
File "C:\ProgramData\Miniconda3\lib\site-packages\pint\quantity.py", line 1400, in __getitem__
value = self._magnitude[key]
IndexError: too many indices for array
我的结论是,输入可以有两个以上的维度,但三维输入(在我的例子中)会产生错误。可以做些什么来修复它们
我对Python绝对是新手,所以我可能犯了一个愚蠢的错误。不幸的是,如果您不知道要查找什么,那么出现的错误消息在这种情况下没有多大帮助 示例中的
vorticity
函数调用的问题在于输入变量的维度不匹配data['u_wind']
和data['v_wind']
是具有形状(29、118、292)
的3D阵列,但是dx
和dy
,因为它们是从lat lon\u grid\u Delta
计算的,分别是具有形状(118、291)
和(117、292)
的2D阵列。因此,我们需要获得适当广播的阵列…有许多不同的方法可以做到这一点,但我建议有两种选择:
选项1:手动广播
由于dx
和dy
缺少的“额外”维度是第一个维度(在垂直方向上),我们可以通过插入一个大小为1的前导维度将dx
和dy
制作成正确对齐的三维阵列:
dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat, initstring=data_crs.proj4_init)
dx = dx[None, :]
dy = dy[None, :]
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)
选项2:使用辅助功能
MetPy还有一个助手函数,可以轻松地从xarray数据数组中提取网格增量。它还可以确保广播正常进行,因此您不必自己进行广播。在您的示例中使用它,它将是:
dx, dy = mpcalc.grid_deltas_from_dataarray(data['u_wind'])
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)
你试过简单的二维案例切片阵列吗?@Alessandro,我用过MetPy的
loc
命令。不管怎样,@JonThielen answer完成了任务。
dx, dy = mpcalc.lat_lon_grid_deltas(lon, lat, initstring=data_crs.proj4_init)
dx = dx[None, :]
dy = dy[None, :]
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)
dx, dy = mpcalc.grid_deltas_from_dataarray(data['u_wind'])
vort = mpcalc.vorticity(data['u_wind'], data['v_wind'], dx, dy)