use*_*790 5 python dask python-xarray
我有一个大型(> 100 GB)xarray数据集,其中包含天气预报数据(维度时间、预测步骤、纬度、经度、随时间变化的dask块、纬度和经度维度),并且想要计算出平均天气(每次点)在不规则形状的区域(由具有维度纬度和经度的二进制掩码数组定义)上。这样做的天真的方法是:
average_weather = weather.where(mask).mean(dim=('latitude', 'longitude'))
Run Code Online (Sandbox Code Playgroud)
然而,对于大多数(纬度、经度)块,该区域中的掩码值均为零,因此无需加载该块。据我所知,通过简要查看 xarray 和 dask 源代码,没有任何优化可以在加载块之前检查块的所有掩码值是否为零,因此天真的命令将使用大量不必要的数据传输和CPU。
我确实看到可以drop=True在where命令中使用将计算限制为掩码的边界框,但是是否可以做得更好?
小智 2
默认情况下,使用时where,掩码所在的值False将替换为NaN。如果您使用该drop=True关键字,它们将被完全删除。请注意,这可能会改变数据的形状,或者NaN有时会导致意外的值。
例如
average_weather = weather.where(mask, drop=True).mean(dim=('latitude', 'longitude'))