代码之家  ›  专栏  ›  技术社区  ›  Shawn

如何使用xr。使用更改的尺寸应用\u ufunc

  •  1
  • Shawn  · 技术社区  · 8 年前

    我有一个用xarray加载的三维气候数据集

    climate = xr.open_dataset(data_file)
    climate
    <xarray.Dataset>
    Dimensions:  (lat: 621, lon: 1405, time: 424)
    Coordinates:
      * time     (time) datetime64[ns] 2017-11-01 2017-11-02 2017-11-03 ...
      * lon      (lon) float64 -125.0 -125.0 -124.9 -124.9 -124.8 -124.8 -124.7 ...
      * lat      (lat) float64 49.92 49.87 49.83 49.79 49.75 49.71 49.67 49.62 ...
    Data variables:
      tmean    (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ...
      status   (time) object 'provisional' 'provisional' 'provisional' ...
    

    我有一个模型,它应用于时间维度,并返回一个仅包含lat,lon的二维数组。

    apply_model(climate.tmean.values).shape
    (621, 1405)
    

    我如何在 xr.apply_ufunc() ?我尝试了几种不同的方法,但它总是抱怨一些尺寸错误。

    例如:

    def apply_model_ufunc(climate):
        return xr.apply_ufunc(
                apply_model, climate,
                input_core_dims=[['lat','lon']])
    
    apply_model_ufunc(climate)
    ValueError: dimensions ('time',) must have the same length as the number of data dimensions, ndim=2
    

    或

    def apply_model_ufunc(climate):
        return xr.apply_ufunc(
                apply_model, climate,
                input_core_dims=[['time','lat','lon']],
                output_core_dims=[['lat','lon']])
    
    apply_model_ufunc(climate)
    ValueError: operand to apply_ufunc has required core dimensions ['time', 'lat', 'lon'], but some of these are missing on the input variable:  ['lat', 'lon']
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Shawn    8 年前

    再摆弄一会儿,我想我明白了。问题是 apply_ufunc 将函数应用于所有数据变量。我的数据集中的“status”变量导致了问题,因为它只有时间维度。工作代码为

    def apply_model_ufunc(climate):
        return xr.apply_ufunc(
                apply_model, climate,
                input_core_dims=[['time']],
                output_dtypes=[float])
    
    apply_model_ufunc(climate['tmean'])