将两个具有不同时间长度的xarray DataArray相乘

问题描述 投票:0回答:1

我有两个数据数组,它们在纬度和经度空间上大小相同,但在时间空间上不同。

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 来完成。

python-3.x python-xarray
1个回答
0
投票

使用 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 数组,速度非常快。

© www.soinside.com 2019 - 2024. All rights reserved.