使用Xarray和Metpy掩盖风

我的目标是仅绘制风钩,使其超过感兴趣区域中观察到的最大风速的2/3(这是标准Miller Composite地图的一部分)。

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,10))
skip_850 = (slice(None,8),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,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,color = '#ff0000')

我在整个域中都有风刺。因此,我对缺少数据表示怀疑。

此外,当我打印mask_500时,我得到一个False。根据风速是高还是低,这应该是一个True或False布尔数组(至少我认为)。

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

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

iCMS 回答:使用Xarray和Metpy掩盖风

在重新创建它时,它会返回到源自您的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

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

本文链接:https://www.f2er.com/2162050.html

大家都在问