我有两个数据数组,它们在纬度和经度空间上大小相同,但在时间空间上不同。
data1
xarray.DataArray (time: 28 latitude: 137 longitude: 261)
data2
xarray.DataArray (time: 224 latitude: 137 longitude: 261)
data1
是2020年2月(2月1-28日)的每日数据,而data2
是2020年2月(2月1-28日)的3小时数据。 data1
表示一个数组,我想用它通过将两者相乘来修改 data2
(和其他数据数组)。我希望通过将每天的 data1
值乘以 data2
中同一天的值来完成此操作。
例如,在 2 月 1 日,
data1
可能为 1.5,而在 2 月 1 日的所有时间,data2
可能为 [1,1.25,1,0.75,1,0,1,1.75]
。我想将 1.5(来自 data1
)乘以 data2
中的所有值,同时保持与 data2
相同的时间维度。这将导致当天的新数组/列表为 [1.5,1.875,1.5,1.125,1.5,0,1.5,2.625]
。这同样适用于未来的日子(2 月 2 日、2 月 3 日等)。
我确信有某种方法可以做到这一点,无论是使用 xarray 还是只是 numpy,但我不确定这到底是如何工作的。最好使用 xarray 来完成。
使用 numpy,可以重塑 3 小时的时间维度,将其分为 3 小时和每日,然后允许与另一个每日数组相乘,如下所示:
np.reshape(data2, (8,28,137,261)) * data1
使用 xarray,您可以通过组合
xarray.coarsen()
和 xarray.construct()
来重塑数组来复制此操作,如此处所述 https://docs.xarray.dev/en/stable/user-guide/reshaping.html。完整的解决方案将是:
# reshape to split months and years
data2_reshape = data2.coarsen(time=len(data1.time), boundary="exact").construct(time=("t_3hourly", "t_daily"))
# Last 3 dimensions are the same, so can be multiplied:
data2_reshape.shape = (8,28,137,261)
data1.shape = (28,137,261)
# multiply the data in the two arrays:
data2_prod = data2_reshape.data * data1.data
# reshape back, merging to single time dimension:
data2_prod = data2_prod.reshape(224, 137, 261)
# Convert back into DataArray object:
data2_prod = xr.DataArray(data2_prod,
coords={"time": data2.time, "latitude": data2.latitude, "longitude": data2.longitude},
dims=["time", "latitude", "longitude"],
)
最棒的是,这也适用于 Dask 数组,速度非常快。