使用Xarray和Metpy掩蔽风

2024-06-28 20:52:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是仅当风倒钩超过感兴趣区域中观测到的最大风速的2/3时绘制风倒钩(这是标准Miller合成图的一部分)

MetPy示例中用于Miller绘图的代码

wspd_500 = mpcalc.wind_speed(u_500, v_500)
wspd_850 = mpcalc.wind_speed(u_850, v_850)


mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask
u_500[mask_500] = np.nan
v_500[mask_500] = np.nan

# 850 hPa
mask_850 = ma.masked_less_equal(wspd_850, 0.66 * np.max(wspd_850)).mask
u_850[mask_850] = np.nan
v_850[mask_850] = np.nan

skip_500 = (slice(None, None, 10), slice(None, None, 10))
skip_850 = (slice(None, None, 8), slice(None, None, 8))

# 500-hPa wind barbs
jet500 = ax.barbs(lon[skip_500], lat[skip_500], u_500[skip_500].m, v_500[skip_500].m, length=6,
                  transform=ccrs.PlateCarree(),
                  color='blue', zorder=9, label='500-hPa Jet Core Winds (kt)')

# 850-hPa wind barbs
jet850 = ax.barbs(lon[skip_850], lat[skip_850], u_850[skip_850].m, v_850[skip_850].m, length=6,
                  transform=ccrs.PlateCarree(),
                  color='k', zorder=8, label='850-hPa Jet Core Winds (kt)')

返回一个错误

TypeError: len() of unsized object

追溯到线路

u_500[mask_500] = np.nan

为了排除故障,我打印了wspd_500:

[[0.3819355070590973 0.41758668422698975 0.41758668422698975 ... nan nan  nan] [0.3577602505683899 0.4053502082824707 0.4053502082824707 ... nan nan  nan] [0.3433985114097595 0.4025561213493347 0.4025561213493347 ... nan nan  nan] ... [nan nan nan ... nan nan nan] [nan nan nan ... nan nan nan] [nan nan nan ... nan nan nan]] meter / second

这很奇怪,因为我不知道为什么这些nan值会不断出现。u_500和v_500似乎包含所有相关值。当我使用不同的方法绘图时:

ax.barbs(x[wind_slice], y[wind_slice], u_850.metpy.unit_array[wind_slice, wind_slice].to('knots'), v_850.metpy.unit_array[wind_slice, wind_slice].to('knots'), length=6, color = '#ff0000')

我的整个领域都有风倒钩。因此,我怀疑数据是否丢失

此外,当我打印mask_500时,我会得到一个错误。这应该是一组真布尔值或假布尔值,取决于风速是高还是低(至少我认为是这样)

所以我的问题是:我如何实现这个面具,在给定的气压水平下,只绘制明显的强风?为什么mpcalc.wind_speed方法从完整的u和v分量数据阵列返回一组nan值

为了便于参考,我使用了通过虹吸从UCAR TDS获得的HRRR数据


Tags: nonenpslicemasknanaxlengthcolor
1条回答
网友
1楼 · 发布于 2024-06-28 20:52:32

在重新创建时,它返回到源自HRRR输出的nan。当我使用虹吸通过NCS拉入当前HRRR输出时,在域的边缘有大约5%的缺失数据。您可以使用^{}检查这一点。如果执行比较mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask,max将返回为nan。与nan的任何比较都将返回False,因此您将获得掩码,指示整个数组的计算结果为False,即您看到的行为。为了避免这种情况,请确保比较值是非nan值的max,例如

notnan_mask_500 = np.isfinite(wspd_500)
mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500[notnan_mask_500])).mask

这将拉出数组的最大有限值,并允许进行比较!我还没有完成映射,但这至少返回了一个有效的掩码和结果数组

相关问题 更多 >