【问题标题】:Concatenating DataArray with tolerance in xarray将 DataArray 与 xarray 中的容差连接起来
【发布时间】:2019-05-29 04:03:52
【问题描述】:

我想连接几个维度坐标几乎对齐的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

【问题讨论】:

  • 您能否更具体地了解输出数据集的外观?坐标和尺寸是多少?

标签: python-xarray


【解决方案1】:

目前,您需要在调用 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 问题跟踪器上打开一个问题来建议此功能。

【讨论】:

  • 谢谢@jhamman。我考虑了您的解决方案,但我们还需要处理坐标范围,对吗?它应该是两个数组的“并集”,而不是交集。
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 2023-01-14
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2020-07-15
  • 2016-12-14
相关资源
最近更新 更多