eofs.xarray 引发 TypeError(使用 DataArray 构造变量是不明确的)

eofs.xarray raising TypeError (Using a DataArray to construct a variable is ambiguous)

我正在使用 xarray 处理多维数据集,但在使用 eofs, the EOF analysis package, and particularly, with its xarray interface 时遇到了一些问题。

我的 xarray DataArray 如下所示:

<xarray.DataArray 'timeMonthly_avg_flux' (time: 1800, y: 601, x: 601)>
array([[[0., 0., ..., 0., 0.],
    [0., 0., ..., 0., 0.],
    ...,
    [0., 0., ..., 0., 0.],
    [0., 0., ..., 0., 0.]],
   [[0., 0., ..., 0., 0.],
    [0., 0., ..., 0., 0.],
    ...,
    [0., 0., ..., 0., 0.],
    [0., 0., ..., 0., 0.]]])
Coordinates:
lat      (y, x) float64 ...
lon      (y, x) float64 ...
time     (time) datetime64[ns] 2001-01-31 2001-02-28 ... 2150-12-31
x        (x) float64 -3e+06 -2.99e+06 -2.98e+06 ... 2.98e+06 2.99e+06 3e+06
y        (y) float64 -3e+06 -2.99e+06 -2.98e+06 ... 2.98e+06 2.99e+06 3e+06

当我运行以下内容时出现问题:

from eofs.xarray import Eof
solver = Eof(flux) # flux is the above DataArray
flux_eofs = solver.eofs()

为此我得到以下类型错误:

TypeError: Using a DataArray object to construct a variable is ambiguous, please extract the data using the .data property.

还注意到此函数中的其他方法按预期工作:我能够按如下方式调用主要组件:

flux_pcs = solver.pcs()

数据集确实有 NaN 值,但据我所知,eofs.xarray 模块设计用于处理 NaN。目前,我的解决方法是将数据集转换为 Numpy 数组并改用 eofs.standard interface,然后根据需要将输出转换回 xarray Datasets/DataArrays。当我这样做时,所有方法都按预期工作:

from eofs.standard import Eof
flux_np = flux.to_numpy()
solver = Eof(flux_np)
flux_eofs = solver.eofs()

我发现了另外两个引发此错误的实例:作为 w2w package, where it seems to have been something to do with the python environment, and here, as part of the PyWake project 的一部分,但我不清楚问题出在哪里。

我最近 运行 在我的项目中遇到了相同的错误消息(它在本质上与您的不同)。我 pip 在我的 PC (0.20.2) 上卸载了最新版本的 xarray 并安装了一个旧版本 (0.16.0),并且(至少)那个错误消失了。

对于遇到此问题的每个人来说,这是一个错误,该错误也已在 Github 上提出和讨论(也是该问题的作者 :))。 xarray 兼容性目前有点损坏。

暂时可以通过更改

手动修复此问题

eofs/lib/eofs/xarray.py - 文件

#Lines 638 to 640
# Add non-dimension coordinates. 
pcs.coords.update({coord.name: (coord.dims, coord)
                       for coord in time_ndcoords})

# Add non-dimension coordinates.
pcs.coords.update({coord.name: (coord.dims, coord.data)
                       for coord in time_ndcoords})

有一个 pull request 解决这个问题,不幸的是还没有被合并。