如何通过 xarray 中的坐标组合二维平铺数据集
How to combine 2D-tiled datasets by coordinates in xarray
我正在开展一个项目,我需要在 Xarray 中将不同的地理图像图块组合成一个大图块。我 运行 遇到了问题。我在下面做了一个简化的例子。
square1 = xr.DataArray(name="box1", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[0,1])])
square2 = xr.DataArray(name="box2", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[0,1])])
square3 = xr.DataArray(name="box3", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[2,3])])
square4 = xr.DataArray(name="box4", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[2,3])])
combineddata = xr.combine_by_coords([square1,square2,square3,square4])
我以为这就是您需要做的全部,但我收到了这个错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-57-fc5add80d55a> in <module>
----> 1 xr.combine_by_coords([square1,square2,square3,square4])
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/combine.py in combine_by_coords(datasets, compat, data_vars, coords, fill_value, join, combine_attrs)
713
714 # Group by data vars
--> 715 sorted_datasets = sorted(datasets, key=vars_as_keys)
716 grouped_by_vars = itertools.groupby(sorted_datasets, key=vars_as_keys)
717
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/combine.py in vars_as_keys(ds)
502
503 def vars_as_keys(ds):
--> 504 return tuple(sorted(ds))
505
506
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/common.py in __bool__(self)
118
119 def __bool__(self: Any) -> bool:
--> 120 return bool(self.values)
121
122 def __float__(self: Any) -> float:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我做错了什么?
Xarray combine_by_coords
目前仅适用于 xarray Dataset 对象,不适用于 DataArray 对象。看到这个问题:https://github.com/pydata/xarray/issues/3248。 @dcherian 提供的解决方法是将 DataArray 转换为数据集,合并,然后再转换回 DataArray。
所以这有效:
import numpy as np
import xarray as xr
square1 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[0,1])])
square2 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[0,1])])
square3 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[2,3])])
square4 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[2,3])])
combineddata = xr.combine_by_coords(sq.to_dataset() for sq in [square1,square2,square3,square4]).to_array()
我正在开展一个项目,我需要在 Xarray 中将不同的地理图像图块组合成一个大图块。我 运行 遇到了问题。我在下面做了一个简化的例子。
square1 = xr.DataArray(name="box1", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[0,1])])
square2 = xr.DataArray(name="box2", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[0,1])])
square3 = xr.DataArray(name="box3", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[2,3])])
square4 = xr.DataArray(name="box4", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[2,3])])
combineddata = xr.combine_by_coords([square1,square2,square3,square4])
我以为这就是您需要做的全部,但我收到了这个错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-57-fc5add80d55a> in <module>
----> 1 xr.combine_by_coords([square1,square2,square3,square4])
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/combine.py in combine_by_coords(datasets, compat, data_vars, coords, fill_value, join, combine_attrs)
713
714 # Group by data vars
--> 715 sorted_datasets = sorted(datasets, key=vars_as_keys)
716 grouped_by_vars = itertools.groupby(sorted_datasets, key=vars_as_keys)
717
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/combine.py in vars_as_keys(ds)
502
503 def vars_as_keys(ds):
--> 504 return tuple(sorted(ds))
505
506
~/my-conda-envs/dem/lib/python3.8/site-packages/xarray/core/common.py in __bool__(self)
118
119 def __bool__(self: Any) -> bool:
--> 120 return bool(self.values)
121
122 def __float__(self: Any) -> float:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我做错了什么?
Xarray combine_by_coords
目前仅适用于 xarray Dataset 对象,不适用于 DataArray 对象。看到这个问题:https://github.com/pydata/xarray/issues/3248。 @dcherian 提供的解决方法是将 DataArray 转换为数据集,合并,然后再转换回 DataArray。
所以这有效:
import numpy as np
import xarray as xr
square1 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[0,1])])
square2 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[0,1])])
square3 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [0,1,2]),('y',[2,3])])
square4 = xr.DataArray(name="box", data=np.random.randint(5, size=(3, 2)), coords=[("x", [3,4,5]),('y',[2,3])])
combineddata = xr.combine_by_coords(sq.to_dataset() for sq in [square1,square2,square3,square4]).to_array()