创建维度名称等于坐标名称的 xarray dataarray

Create xarray datarray with dimension names equal to coordinate names

亲爱的,我需要创建一个 xarray.datarray,其维度名称与坐标名称相同,但是,我没有成功。这是复制代码:

import numpy as np
import xarray as xr

data = [[23, 22, 21],
       [22, 20, 24]]

x, y = np.meshgrid([-45, -44, -43], [-21, -20])

t2m = xr.DataArray(data=data,
                   dims=["lon", "lat"],
                   coords=dict(
                   lon=(["lon", "lat"], x),
                   lat=(["lon", "lat"], y)))

使用此代码我得到以下错误:

MissingDimensionsError: 'lon' has more than 1-dimension and the same name as one of its dimensions ('lon', 'lat'). xarray disallows such variables because they conflict with the coordinates used to label dimensions.

要创建没有此错误的数据阵列,我只需更改维度的名称:

t2m = xr.DataArray(data=data,
               dims=["x", "y"],
               coords=dict(
               lon=(["x", "y"], x),
               lat=(["x", "y"], y)))

但是,我想使用 .sel 方法提取特定坐标的值,并且只有在维度值等于坐标时才有效,例如:

t2.sel(lon=-45, lat=-21, method='nearest')

有人可以帮我解决这个问题吗?我从互联网资源下载的 netCDF 文件(例如带有 ERA5 reanalisys 数据的哥白尼 netCDF 文件)的坐标名称等于维度,维度值等于坐标值,因此允许使用 .sel() 方法提取给定数据坐标(经度,纬度)。

非常感谢您。

简短的回答是您不能使用 .sel 到 select 多维坐标中的单个元素。

请参阅 this question,其中包含一些可能的选项。如果你有多维坐标 lat/lon,根本不能保证 da.sel(lon=..., lat=...) 会 return 一个唯一或正确的结果(注意 xarray 不是设计来处理 lat/lon 作为特殊的地理空间坐标),因此 da.sel 不适用于此用例。

您需要将预期的 (lon, lat) 对转换为 (x, y) space,或者使用 t2.where((abs(t2.lon - lon) < tol) & (abs(t2.lat - lat) < tol), drop=True) 或类似内容屏蔽数据。

有关详细信息,请参阅 xarray docs on working with MultiDimensional Coordinates

正如我们在您的代码中看到的那样,您的网格 规则的,因此您可以拥有一维坐标,因此可以像您的尺寸一样命名它们:

import xarray as xr

data = [[23, 22, 21],
        [22, 20, 24]]

lon, lat = [-45, -44, -43], [-21, -20]

t2m = xr.DataArray(data=data,
                   dims=["lat", "lon"],
                   coords=dict(lon=("lon", lon), lat=("lat", lat)))

t2m.sel(lon=-45, lat=-21, method='nearest')

这样,您就可以使用sel