xarray 0.17.0可用代码在2022.11.0版本报错,求修正方案
xarray新版本添加坐标报错的修复方案
问题背景
一段代码在xarray 0.17.0版本可正常运行,但升级到2022.11.0版本后执行报错,错误信息如下:
/home/alexandre/miniconda3/envs/grade_2020_3/bin/python /home/alexandre/Dropbox/grade_2020/examples/teste_lixo.py Traceback (most recent call last): File "/home/alexandre/Dropbox/grade_2020/examples/teste_lixo.py", line 14, in <module> prec.coords['mask'] = (('latitude', 'longitude'), mask_array) File "/home/alexandre/miniconda3/envs/grade_2020_3/lib/python3.8/site-packages/xarray/core/coordinates.py", line 32, in __setitem__ self.update({key: value}) File "/home/alexandre/miniconda3/envs/grade_2020_3/lib/python3.8/site-packages/xarray/core/coordinates.py", line 162, in update coords, indexes = merge_coords( File "/home/alexandre/miniconda3/envs/grade_2020_3/lib/python3.8/site-packages/xarray/core/merge.py", line 564, in merge_coords collected = collect_variables_and_indexes(aligned) File "/home/alexandre/miniconda3/envs/grade_2020_3/lib/python3.8/site-packages/xarray/core/merge.py", line 365, in collect_variables_and_indexes variable = as_variable(variable, name=name) File "/home/alexandre/miniconda3/envs/grade_2020_3/lib/python3.8/site-packages/xarray/core/variable.py", line 126, in as_variable raise TypeError( TypeError: Using a DataArray object to construct a variable is ambiguous, please extract the data using the .data property. Process finished with exit code 1
报错核心行:prec.coords['mask'] = (('latitude', 'longitude'), mask_array)
原代码
import xarray as xr import numpy as np path_var = '/home/alexandre/Dropbox/grade_2020/data/netcdf_files/' prec = xr.open_mfdataset(path_var + 'pr_19610101_19801231_BR-DWGD_UFES_UTEXAS_v_3.0.nc') # 生成海陆掩码 mask_ocean = 2 * np.ones(prec['pr'].shape[1:]) * np.isnan(prec['pr'].isel(time=0)) mask_land = 1 * np.ones(prec['pr'].shape[1:]) * ~np.isnan(prec['pr'].isel(time=0)) mask_array = mask_ocean + mask_land # 添加掩码坐标(报错行) prec.coords['mask'] = (('latitude', 'longitude'), mask_array)
修复方案
xarray新版本对坐标赋值的格式要求更严格,需替换报错行代码为以下两种方式之一:
方式1:包装为带维度的DataArray
直接将掩码数组封装成带有对应维度的DataArray后赋值:
prec.coords['mask'] = xr.DataArray(mask_array, dims=('latitude', 'longitude'))
方式2:提取底层numpy数组(若mask_array是DataArray)
如果mask_array本身是xarray的DataArray对象,需用.data提取其底层numpy数组,再封装为DataArray赋值:
prec.coords['mask'] = xr.DataArray(mask_array.data, dims=('latitude', 'longitude'))
原因说明
xarray 0.17.0之后的版本,不再支持直接通过(维度元组, 数据)的格式向coords添加坐标,要求明确传入Variable或DataArray对象,以此避免构造变量时的歧义性,这也是报错信息提示"请使用.data属性提取数据"的核心原因。
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

