xarray apply_ufunc 获取每个变量的最小值和最大值

xarray apply_ufunc to get the min and max for every variable

我目前有:

xds = xr.tutorial.open_dataset('air_temperature')
xds['airx2'] = xds['air'] * 2

def _min_max(x):
    return np.min(x), np.max(x)

xr.apply_ufunc(_min_max, xds, input_core_dims=[['time', 'lat', 'lon']])

哪个returns:

<xarray.Dataset>
Dimensions:  ()
Data variables:
   air      object (221.0, 317.4)
   airx2    object (442.0, 634.8)

如何扩展每个数据变量以具有最小/最大坐标,或 min_air、max_air、min_airx2、max_airx2 数据变量,以便我没有使用对象 dtype 而是使用 float?

我试过了

xr.apply_ufunc(_min_max, xds, input_core_dims=[['time', 'lat', 'lon']], output_core_dims=[['min', 'max']])

但它出错了:

ValueError: applied function returned data with unexpected number of dimensions: 0 vs 2, for dimensions ('min', 'max')

如果您想沿着新的维度扩展,您需要 (1) return 一个 numpy 数组而不是元组,并且 (2) 在 `output_core_dims:[= 中指定新的维度13=]

def _min_max(x):
    return np.array([np.min(x), np.max(x)])

>>> xr.apply_ufunc(_min_max, xds, input_core_dims=[['time', 'lat', 'lon']],
...                output_core_dims=[['min_max']])
<xarray.Dataset>
Dimensions:  (min_max: 2)
Dimensions without coordinates: min_max
Data variables:
    air      (min_max) float32 221.0 317.4
    airx2    (min_max) float32 442.0 634.8

或者,您可以 return 来自应用函数的数组元组,在这种情况下,您将从 apply_ufunc:

中得到 xarray 对象的元组
def _min_max(x):
    return np.min(x), np.max(x)

>>> xr.apply_ufunc(_min_max, xds, input_core_dims=[['time', 'lat', 'lon']],
...                output_core_dims=[[], []])
(<xarray.Dataset>
 Dimensions:  ()
 Data variables:
     air      float32 221.0
     airx2    float32 442.0, <xarray.Dataset>
 Dimensions:  ()
 Data variables:
     air      float32 317.4
     airx2    float32 634.8)