创建维度名称等于坐标名称的 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
。
亲爱的,我需要创建一个 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
。