You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:08