Xarray combine_by_coords返回单调全局索引错误

13
我正在尝试使用combine_by_coords合并两个空间xarray数据集。这两个数据集是相邻的两个瓦片,因此存在重叠坐标。在重叠区域,其中一个数据集的变量值为nan。
我使用了“combine_by_coords”选项,并选择compat='no_conflicts'。然而,它返回了“沿y维度单调全局索引”的错误。看起来这是之前的问题,但已经被修复(这里)。所以我不知道为什么会出现这个错误。以下是一个示例(netcdf瓦片在这里):
import xarray as xr

print(xr.__version__)
>>>0.15.1

ds1=xr.open_dataset('Tile1.nc')
ds2=xr.open_dataset('Tile2.nc')
ds = xr.combine_by_coords([ds1,ds2], compat='no_conflicts')
>>>...
 ValueError: Resulting object does not have monotonic global indexes along dimension y

谢谢


对我来说,这似乎是一个错误。在 combine_by_coords 中,_combine_nd 返回的索引对于您的 y 坐标实际上是非单调的,我不知道为什么会这样。 - paime
谢谢。有没有其他方法(如xarray或其他包)可以做同样的事情?我会在xarray的GitHub上开一个问题... - Ress
它可以使用 xr.merge([ds1, ds2]) 运行,这使得 xr.combine_by_coords 失败更加可疑。也许您可以开一个问题。 - paime
我刚在xarray上打开了一个问题。合并歪曲了数据。它改变了值,位移了像素,并且在图像上留下nan值条带。 - Ress
1个回答

15

这并不是一个 bug,它抛出了应该抛出的错误,基于你提供的输入。然而,我可以看到文档并没有很清楚地说明为什么会发生这种情况!

combine_by_coordscombine_nested 实现两个功能:它们通过使用 xr.concat 进行连接和使用 xr.merge 进行合并。 merge 对相同大小的变量进行分组,concat 将不同大小的变量连接到另一个变量的末尾。连接步骤从未处理部分重叠的坐标,并且 combine 函数因此具有相同的限制。

该错误是针对您提供的输入的明确拒绝:“您给了我重叠的坐标,我不知道如何连接它们,所以我会拒绝它们。” 通常这是有道理的-当重叠的坐标不是 NaN 时,选择哪些值是不确定的。

在您的情况下,您要求它执行一个明确定义的操作,并且关于合并重叠坐标的讨论在这里 暗示着 compat='no_conflicts' 可以处理此情况。不幸的是,这仅适用于 xr.merge,而不适用于 xr.concat,因此它也不适用于combine_by_coords。这绝对令人困惑。

如果您描述的情况(重叠坐标部分完全由非NaN值指定)可以处理,那么将combine函数泛化以处理该情况是可能的。如果您希望看到该功能,请打开一个问题提出此建议。

(问题# 3150涉及另一件事,在处理“各数据集之间未变化的坐标维度”方面存在实际错误。)

相反,您需要先修剪重叠部分。这不应该很难 - 您可能已经知道(或者可以确定)您的重叠部分有多大,而且所有的NaN都在一个数据集中。您只需使用带有切片的.isel()方法即可。一旦去除了重叠的NaN,然后就应该能够很好地组合它(而且您也不需要指定compat)。如果您正在使用combine_by_coords来作为使用open_mfdataset打开许多文件的一部分,那么编写一个修剪函数并首先使用open_mfdatasetpreprocess参数应用它可能更容易些。


3
谢谢您的解释!现在我理解得更清楚了。 - Ress
你有这样一个修剪函数的例子吗?在我的情况下,我有时间数据重叠(但两个数组都被填充了,我想保留最后一个)。 - 3dSpatialUser
1
你的修剪函数只接受一个数据集并返回一个(修剪后的)数据集。因此,你可以像这样使用lambda函数:preprocess=lambda ds: ds.isel(time=slice(0, -1)) - ThomasNicholas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接