将DataArray与xarray中的容限连接起来

时间:2019-01-02 13:47:32

标签: python-xarray

我想将尺寸坐标几乎对齐的几个DataArray串联起来,像这样:

import xarray as xr
da1 = xr.DataArray([[0, 1], [2, 3]], coords=[[0, 1], [0, 1]], dims=['x', 'y'])
da2 = xr.DataArray([[4, 5], [6, 7]], coords=[[0.1, 1.1], [-0.1, 0.9]], dims=['x', 'y'])
da = xr.concat([da1, da2], 'z')

但是由于坐标不完全对齐,我得到da

<xarray.DataArray (z: 2, x: 4, y: 4)>
array([[[nan,  0., nan,  1.],
        [nan, nan, nan, nan],
        [nan,  2., nan,  3.],
        [nan, nan, nan, nan]],

       [[nan, nan, nan, nan],
        [ 4., nan,  5., nan],
        [nan, nan, nan, nan],
        [ 6., nan,  7., nan]]])
Coordinates:
  * x        (x) float64 0.0 0.1 1.0 1.1
  * y        (y) float64 -0.1 0.0 0.9 1.0
Dimensions without coordinates: z

像我们使用reindex一样,能够容忍坐标中的某些差异将是很好的:

da = xr.concat([da1, da2], 'z', method='nearest', tolerance=0.2)

是否存在该功能不存在的原因?我该如何解决?

编辑:

如@jhamman所建议,以下示例更好地说明了我希望输出DataArray是:

import xarray as xr
da1 = xr.DataArray([[0, 1], [2, 3]], coords=[[0, 1], [0, 1]], dims=['x', 'y'])
da2 = xr.DataArray([[4, 5], [6, 7]], coords=[[1.1, 2.1], [1.1, 2.1]], dims=['x', 'y'])
da = xr.concat([da1, da2], 'z', method='nearest', tolerance=0.2) # doesn't exist yet
da

请注意,da2的坐标1.1已从da1变为1,因为它已经足够接近了。 da2中的坐标2.1不能与da1中的任何坐标匹配,因此它保持原样。因此,匹配坐标取决于DataArray的处理顺序:

<xarray.DataArray (z: 2, x: 3, y: 3)>
array([[[ 0.,  1., nan],
        [ 2.,  3., nan],
        [nan, nan, nan]],

       [[nan, nan, nan],
        [nan,  4.,  5.],
        [nan,  6.,  7.]]])
Coordinates:
  * x        (x) float64 0 1 2.1
  * y        (y) float64 0 1 2.1
Dimensions without coordinates: z

1 个答案:

答案 0 :(得分:0)

当前,您需要在调用xr.concat之前手动重新索引数组:

In [1]:     import xarray as xr
   ...:     da1 = xr.DataArray([[0, 1], [2, 3]], coords=[[0, 1], [0, 1]], dims=['x', 'y'])
   ...:     da2 = xr.DataArray([[4, 5], [6, 7]], coords=[[0.1, 1.1], [-0.1, 0.9]], dims=['x', 'y'])
   ...:     da2r = da2.reindex_like(da1, method='nearest', tolerance=0.2)
   ...:     da = xr.concat([da1, da2r], 'z')
   ...:     da
   ...:
Out[1]:
<xarray.DataArray (z: 2, x: 2, y: 2)>
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
Coordinates:
  * x        (x) int64 0 1
  * y        (y) int64 0 1
Dimensions without coordinates: z
  

此功能不存在是有原因的吗?

我不这么认为。我建议在xarray GitHub问题跟踪器上打开一个问题以建议此功能。

相关问题