我正在尝试在xarray中执行“ join”,但是在其中一项上使用了非索引坐标。我认为这应该不太困难,但是我一直在旋转。
我有一个在'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
的{{1}}来将ds.b
添加到数据集中吗?
这在某种程度上与Join along a non-coordinate dimension in xarray有关,但是我不想做任何杂技表演,最终结果应该以{{1}}而不是da.b
谢谢!
编辑:按照@DSM的要求,输出为:
'a'
Edit2:这是带有字符串键的示例答案,其中'b'
仅具有键的子集。 (尽管其他对齐方式可能会有所帮助,但我认为<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 ...
有一个子集时,这种方法不起作用)
ds
答案 0 :(得分: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
您可以在分配中使用它来在da
上加入ds.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文档提供了此功能的一些很好的示例。