首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xarray assign_coords无法设置新的坐标。

xarray assign_coords无法设置新的坐标。
EN

Stack Overflow用户
提问于 2022-03-17 23:44:18
回答 3查看 541关注 0票数 0

我有一个NetCDF文件,并试图使用xarray读取一个变量(没有属性和坐标),然后给它分配新的属性和坐标。下面是我的python代码:

代码语言:javascript
复制
#--- 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变量都具有相同的大小(2d数组)。现在tsk有属性,但仍然没有坐标。我做错了什么吗?没有错误。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-18 00:29:34

assign_coords不是就地操作。

来自xarray.DataArray.assign_coords文档:

除了新的坐标外,

还返回一个新对象,其中包含所有原始数据。

所以你需要:

代码语言:javascript
复制
tsk = tsk.assign_coords(lat=xlat, lon=xlon)
票数 1
EN

Stack Overflow用户

发布于 2022-03-18 16:22:25

This answer是您所述问题的直接解决方案。

作为使用assign_coords的另一种方法,您所拥有的似乎是一个没有坐标(lat, lon)的维度数据集,而非索引坐标xlat (lat)xlon (lon)给出了实际的lat/lon值。在读取netCDF数据时,这是一种非常常见的情况。

我想你的数据看起来是这样的:

代码语言:javascript
复制
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_dimsxr.Dataset.swap_dims在具有相同维度的索引和非索引坐标之间切换。就你而言:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2022-03-17 23:54:41

我认为你应该说tsk.wrfout_tsk_tavg是一个变量,它包含了lat和lon。从零开始创建dataset应该可以做到这一点:

代码语言:javascript
复制
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)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71520304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档