0

我的目标是仅在超过感兴趣区域中观察到的最大风速的 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。这应该是一组 True 或 False 布尔值,具体取决于风速是高还是低(至少我认为)。

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

作为参考,我使用的是通过虹吸管从 UCAR TDS 获得的 HRRR 数据。

4

1 回答 1

0

在重新创建它时,它会回到nan源自您的 HRRR 输出。当我使用虹吸管通过 NCSS 拉入当前 HRRR 输出时,我在域边缘周围丢失了大约 5% 的数据。您可以使用numpy.isnan. 如果您执行比较mask_500 = ma.masked_less_equal(wspd_500, 0.66 * np.max(wspd_500)).mask,最大值将返回为nan. 任何比较都nan将返回False,因此您得到的掩码表明整个数组评估为False,即您所看到的行为。为避免这种情况,请确保您的比较值max是非 nan 值,例如,

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

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

于 2020-07-08T22:49:21.077 回答