使用Xarray和Metpy掩盖风



我的目标是仅在风倒钩超过感兴趣域中观察到的最大风速的 2/3 时才绘制它们(这是标准米勒复合地图的一部分(。

MetPy 示例中对米勒图执行此操作的代码

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时,我得到一个 False。这应该是一个真或假布尔值的数组,具体取决于风速是高还是低(至少我认为(。

所以我的问题是:我怎样才能实现这个面罩,只在给定的压力水平下绘制明显的强风?为什么 mpcalc.wind_speed 方法从完整的 u 和 v 组件数据数组中返回一堆 nan 值?

为了以防万一有帮助,我正在使用通过虹吸管从UCAR TDS获得的HRRR数据。

在重新创建它时,它会回到源自 HRRR 输出nan。当我使用虹吸管通过 NCSS 提取当前 HRRR 输出时,域边缘周围大约有 5% 的数据缺失。您可以使用numpy.isnan进行检查。如果执行比较mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask则最大值将返回为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

这将拉出数组的最大有限值并允许比较工作!我还没有一路制作地图,但这至少返回了一个有效的掩码和生成的数组。

相关内容

  • 没有找到相关文章

最新更新