【问题标题】:Join using a non-index coord in xarray在 xarray 中使用非索引坐标加入
【发布时间】:2018-10-09 00:33:33
【问题描述】:

我正在尝试在 xarray 中进行“加入”,但在其中一项上使用了非索引坐标。我认为这应该不会太难,但我一直在旋转。

我有一个在'a' 上索引的数据集,在'b' 上有一个坐标,在'b' 上索引了一个DataArray:

In [17]: ds=xr.Dataset(dict(a=(('x'),np.random.rand(10))), coords=dict(b=(('x'),list(range(10)))))

In [18]: ds
Out[18]:
<xarray.Dataset>
Dimensions:  (x: 10)
Coordinates:
    b        (x) int64 0 1 2 3 4 5 6 7 8 9
Dimensions without coordinates: x
Data variables:
    a        (x) float64 0.3634 0.2132 0.6945 0.5359 0.1053 0.07045 0.5945 ...

In [19]: da=xr.DataArray(np.random.rand(10), dims=('b',), coords=dict(b=(('b'),list(range(10)))))

In [20]: da
Out[20]:
<xarray.DataArray (b: 10)>
array([0.796987, 0.275992, 0.747882, 0.240374, 0.435143, 0.285271, 0.753582,
       0.556038, 0.365889, 0.434844])
Coordinates:
  * b        (b) int64 0 1 2 3 4 5 6 7 8 9

我可以通过加入等于da.bds.bda 添加到我的数据集吗?

这和Join along a non-coordinate dimension in xarray有点关系,但是我不想做任何算术,最终结果的尺寸应该是'a',而不是'b'

谢谢!

编辑:根据@DSM 的要求,输出将是:

<xarray.Dataset>
Dimensions:  (x: 10)
Coordinates:
    b        (x) int64 0 1 2 3 4 5 6 7 8 9
Dimensions without coordinates: x
Data variables:
    a        (x) float64 0.3634 0.2132 0.6945 0.5359 0.1053 0.07045 0.5945 ...
    da       (x) float64 0.796987, 0.275992, 0.747882, 0.240374, 0.435143 ...

Edit2:这是一个带有字符串键的示例答案,其中 ds 只有一个键子集。 (如果da 有一个子集,我认为这种方法不起作用,但额外的对齐可能会有所帮助)

In [23]: da=xr.DataArray(np.random.rand(5), dims=('b',), coords=dict(b=(('b'),list('edcba'))))


In [27]: da
Out[27]:
<xarray.DataArray (b: 5)>
array([0.174843, 0.953963, 0.092538, 0.749569, 0.780823])
Coordinates:
  * b        (b) <U1 'e' 'd' 'c' 'b' 'a'


In [25]: ds=xr.Dataset(dict(a=(('x'),np.random.rand(4))), coords=dict(b=(('x'),list('abcd'))))


In [24]: ds
Out[24]:
<xarray.Dataset>
Dimensions:  (x: 5)
Coordinates:
    b        (x) <U1 'a' 'b' 'c' 'd' 'e'
Dimensions without coordinates: x
Data variables:
    a        (x) float64 0.7586 0.3529 0.5936 0.741 0.6344


In [26]: da.sel(b=ds.b)
Out[26]:
<xarray.DataArray (x: 4)>
array([0.780823, 0.749569, 0.092538, 0.953963])
Coordinates:
    b        (x) <U1 'a' 'b' 'c' 'd'
Dimensions without coordinates: x

【问题讨论】:

  • 您能否编辑以包含您期望的输出?

标签: python-xarray


【解决方案1】:

如果您提供 DataArray 而不是索引器的列表/向量,则数组将被重新调整为索引器的坐标:

In [5]: da.sel(b=ds.b)
Out[5]:
<xarray.DataArray (x: 10)>
array([0.327058, 0.904678, 0.455166, 0.67915 , 0.426856, 0.295434, 0.272206,
       0.630101, 0.447915, 0.157343])
Coordinates:
    b        (x) int64 0 1 2 3 4 5 6 7 8 9
Dimensions without coordinates: x

你可以在作业中使用它来加入dads.b

In [6]: ds['da'] = da.sel(b=ds.b)

In [7]: ds
Out[7]:
<xarray.Dataset>
Dimensions:  (x: 10)
Coordinates:
    b        (x) int64 0 1 2 3 4 5 6 7 8 9
Dimensions without coordinates: x
Data variables:
    a        (x) float64 0.9338 0.9901 0.4498 0.49 0.3023 0.2622 0.03598 0.2 ...
    da       (x) float64 0.3271 0.9047 0.4552 0.6791 0.4269 0.2954 0.2722 ...

More advanced indexing 上的 xarray 文档提供了有关此功能的一些很好的示例。

【讨论】:

  • 感谢您的参与。反思一下,您确定这似乎只是因为坐标标签是用作索引位置的整数吗?如果我将 0-9 更改为 a-j,这将不再有效。
  • 如果b 坐标在两个数据集中相同,这仍然有效。如果您想使用位置索引,可以使用da.isel
  • 谢谢!我添加了一个工作示例。感谢您帮助解决此问题。
  • 绝对!如果 da 有一个键子集,da.sel(b=ds.b) 肯定会产生一个KeyError。如果您希望它返回 NaN 或填充值,您可以在选择数据之前使用 da.reindex 重新索引数组。
  • 完美,谢谢!你在 GH 上用的是不同的名字吗?或者你不经常在那里为 xarray 做贡献?
猜你喜欢
  • 2021-01-14
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2022-12-07
  • 2017-03-25
  • 2017-01-08
相关资源
最近更新 更多