xarray assign_coords 无法设置新坐标
xarray assign_coords does not work to set new coordinates
我有一个 NetCDF 文件并尝试使用 xarray 读取一个变量(没有属性和坐标),然后为其分配新的属性和坐标。这是我的 python 代码:
#--- Import packages:
import numpy as np
import xarray as xr
#--- Read in data:
fin = xr.open_dataset("sample.nc")
tsk = fin.wrfout_tsk_tavg
xlat = fin.latitude
xlon = fin.longitude
#--- Setting new attributes and coordinates:
tsk.attrs['units'] = 'K'
tsk.assign_coords(lat=xlat, lon=xlon)
在NetCDF文件中,tsk、xlat、xlon变量都有相同大小(二维数组)。
现在tsk有属性了,但是还是没有坐标。难道我做错了什么?没有错误。
我认为你应该说明 tsk.wrfout_tsk_tavg 是一个具有坐标纬度和经度的变量。从头开始创建数据集应该可以解决问题:
ds = xr.Dataset(
data_vars=dict(
wrfout_tsk_tavg=["lon", "lat"], fin.wrfout_tsk_tavg)),
coords=dict(lon=(["lon", "lat"], fin.longitude),
lat=(["lon", "lat"], fin.latitude)))
assign_coords
不是 in-place 操作
来自 xarray.DataArray.assign_coords
文档:
Returns a new object with all the original data in addition to the new coordinates.
所以你需要:
tsk = tsk.assign_coords(lat=xlat, lon=xlon)
是您所述问题的直接解决方案。
作为使用 assign_coords 的替代方法 - 看来您拥有的数据集的维度没有坐标 (lat, lon)
,non-indexing 坐标 xlat (lat)
和 xlon (lon)
给出实际的 lat/lon 值。这是读取 netCDF 数据时非常常见的情况。
我想你的数据看起来像这样:
In [3]: ds = xr.Dataset(
...: {'wrfout_tsk_tavg': (('lat', 'lon'), np.random.random((4, 8)))},
...: coords={
...: 'xlat': (('lat', ), np.arange(23, 27)),
...: 'xlon': (('lon', ), np.arange(-110, -102)),
...: },
...: )
In [4]: ds
Out[4]:
<xarray.Dataset>
Dimensions: (lat: 4, lon: 8)
Coordinates:
xlat (lat) int64 23 24 25 26
xlon (lon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Dimensions without coordinates: lat, lon
Data variables:
wrfout_tsk_tavg (lat, lon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409
您可以使用 xr.DataArray.swap_dims
or xr.Dataset.swap_dims
在索引和具有相同维度的 non-indexing 坐标之间切换。你的情况:
In [5]: ds = ds.swap_dims({"lat": "xlat", "lon": "xlon"})
...: ds
Out[5]:
<xarray.Dataset>
Dimensions: (xlat: 4, xlon: 8)
Coordinates:
* xlat (xlat) int64 23 24 25 26
* xlon (xlon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Data variables:
wrfout_tsk_tavg (xlat, xlon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409
我有一个 NetCDF 文件并尝试使用 xarray 读取一个变量(没有属性和坐标),然后为其分配新的属性和坐标。这是我的 python 代码:
#--- Import packages:
import numpy as np
import xarray as xr
#--- Read in data:
fin = xr.open_dataset("sample.nc")
tsk = fin.wrfout_tsk_tavg
xlat = fin.latitude
xlon = fin.longitude
#--- Setting new attributes and coordinates:
tsk.attrs['units'] = 'K'
tsk.assign_coords(lat=xlat, lon=xlon)
在NetCDF文件中,tsk、xlat、xlon变量都有相同大小(二维数组)。 现在tsk有属性了,但是还是没有坐标。难道我做错了什么?没有错误。
我认为你应该说明 tsk.wrfout_tsk_tavg 是一个具有坐标纬度和经度的变量。从头开始创建数据集应该可以解决问题:
ds = xr.Dataset(
data_vars=dict(
wrfout_tsk_tavg=["lon", "lat"], fin.wrfout_tsk_tavg)),
coords=dict(lon=(["lon", "lat"], fin.longitude),
lat=(["lon", "lat"], fin.latitude)))
assign_coords
不是 in-place 操作
来自 xarray.DataArray.assign_coords
文档:
Returns a new object with all the original data in addition to the new coordinates.
所以你需要:
tsk = tsk.assign_coords(lat=xlat, lon=xlon)
作为使用 assign_coords 的替代方法 - 看来您拥有的数据集的维度没有坐标 (lat, lon)
,non-indexing 坐标 xlat (lat)
和 xlon (lon)
给出实际的 lat/lon 值。这是读取 netCDF 数据时非常常见的情况。
我想你的数据看起来像这样:
In [3]: ds = xr.Dataset(
...: {'wrfout_tsk_tavg': (('lat', 'lon'), np.random.random((4, 8)))},
...: coords={
...: 'xlat': (('lat', ), np.arange(23, 27)),
...: 'xlon': (('lon', ), np.arange(-110, -102)),
...: },
...: )
In [4]: ds
Out[4]:
<xarray.Dataset>
Dimensions: (lat: 4, lon: 8)
Coordinates:
xlat (lat) int64 23 24 25 26
xlon (lon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Dimensions without coordinates: lat, lon
Data variables:
wrfout_tsk_tavg (lat, lon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409
您可以使用 xr.DataArray.swap_dims
or xr.Dataset.swap_dims
在索引和具有相同维度的 non-indexing 坐标之间切换。你的情况:
In [5]: ds = ds.swap_dims({"lat": "xlat", "lon": "xlon"})
...: ds
Out[5]:
<xarray.Dataset>
Dimensions: (xlat: 4, xlon: 8)
Coordinates:
* xlat (xlat) int64 23 24 25 26
* xlon (xlon) int64 -110 -109 -108 -107 -106 -105 -104 -103
Data variables:
wrfout_tsk_tavg (xlat, xlon) float64 0.4214 0.5839 0.6675 ... 0.4333 0.4409