如何在 3d xarray 数据上实现求和 (∑)?

How to implement summation (∑) on 3d xarray data?

假设我在 xarray 格式的数据集中有两个变量,如下所示:

import numpy as np
import pandas as pd
import xarray as xr
pre= 10 * np.random.rand(5, 4, 10)
temp = 15 * np.random.rand(5, 4, 10)
time = pd.date_range("2014-01", periods=10, freq='MS')

ds = xr.Dataset(
    data_vars=dict(
        temperature=(["lat", "lon", "time"], temp),
        precipitation=(["lat", "lon", "time"], pre),
    ),
    coords={"lon": [25, 25.5, 26, 26.5], "lat": [42.5, 43, 43.5, 44, 44.5], "time": time},
    attrs=dict(description="Weather related data."),)

对于如何计算以下公式的任何帮助,我表示感谢:

到目前为止,我正在尝试按以下方式解决它:

ds_pre_std = ds.pre.std(dim="time", skipna=True)

Z1= xr.zeros_like(ds.pre)

for k in range(len(ds.time)):
    Z[k, :, :] = np.sum(ds.pre[k, :, :] - ds.temp[k, :, :]) ** 2 / ds_pre_std


Z2= xr.zeros_like(ds.pre)
for k in range(len(ds.time)):
    Z2[k, :, :] = np.sum(ds.pre[k, :, :] - ds.pre.mean("time")) ** 2 / ds_pre_std 

Z = Z1 / Z2

但我确信我离正确的结果还有很长的路要走,特别是对于求和函数,我认为我必须根据公式定义第一个和最后一个值!

感谢您提供清晰的示例。

如果我对这个例子的解释是正确的——并且我们想减少时间维度——那么这是上半部分,下半部分完全一样。


In [1]: import numpy as np
   ...: import pandas as pd
   ...: import xarray as xr
   ...: pre= 10 * np.random.rand(5, 4, 10)
   ...: temp = 15 * np.random.rand(5, 4, 10)
   ...: time = pd.date_range("2014-01", periods=10, freq='MS')
   ...:
   ...: ds = xr.Dataset(
   ...:     data_vars=dict(
   ...:         temperature=(["lat", "lon", "time"], temp),
   ...:         precipitation=(["lat", "lon", "time"], pre),
   ...:     ),
   ...:     coords={"lon": [25, 25.5, 26, 26.5], "lat": [42.5, 43, 43.5, 44, 44.5], "time": time},
   ...:     attrs=dict(description="Weather related data."),)

In [2]: ds
Out[2]:
<xarray.Dataset>
Dimensions:        (lat: 5, lon: 4, time: 10)
Coordinates:
  * lon            (lon) float64 25.0 25.5 26.0 26.5
  * lat            (lat) float64 42.5 43.0 43.5 44.0 44.5
  * time           (time) datetime64[ns] 2014-01-01 2014-02-01 ... 2014-10-01
Data variables:
    temperature    (lat, lon, time) float64 0.5981 11.84 11.35 ... 4.074 12.49
    precipitation  (lat, lon, time) float64 7.012 7.678 9.634 ... 2.729 5.944
Attributes:
    description:  Weather related data.

In [3]: numer_1 = (ds['precipitation']) - ds['temperature']) ** 2

In [4]: denom_1 = ds['precipitation'].std('time')

In [5]: numer_1 / denom_1
Out[5]:
<xarray.DataArray (lat: 5, lon: 4)>
array([[6.65870313, 0.01847954, 1.35175245, 1.33186654],
       [4.37142192, 2.57042848, 5.10478184, 7.57213791],
       [0.33377772, 4.65275033, 0.05615346, 0.10104126],
       [2.05970793, 3.75681053, 9.89674346, 0.80563933],
       [3.57408137, 0.11641076, 4.55715038, 0.03830404]])
Coordinates:
  * lon      (lon) float64 25.0 25.5 26.0 26.5
  * lat      (lat) float64 42.5 43.0 43.5 44.0 44.5


...下半场类似。

值得注意的是,无需使用 python 循环或 numpy 函数 - 这种操作完全在 xarray 的舒适范围内。


编辑:回答你的问题,是分母(虽然你写的是分子,所以我可能很困惑):

In [22]: (ds['precipitation'] - ds['precipitation'].mean('time')) / ds['precipitation'].std('time')

Out[22]:
<xarray.DataArray 'precipitation' (lat: 5, lon: 4, time: 10)>
array([[[-0.98966504, -0.11198979, -0.75832633,  1.3114296 ,
          1.14629021,  0.63349046, -1.07008682,  1.16006701,
         -0.25235464, -1.13866263]]])
Coordinates:
  * lon      (lon) float64 25.0 25.5 26.0 26.5
  * lat      (lat) float64 42.5 43.0 43.5 44.0 44.5
  * time     (time) datetime64[ns] 2014-01-01 2014-02-01 ... 2014-10-01