5

2 つのデータセットがあり、それぞれに対象となる異なる変数が含まれており、インデックスが不完全 (ただし競合していない) であるとします。

In [1]: import xarray as xr, numpy as np
In [2]: ages = xr.Dataset(
          {'ages': (['kid_ids'], np.random.rand((3))*20)}, 
          coords={'kid_names':(['kid_ids'], ['carl','kathy','gail']), 'kid_ids': [10,14,16]})
In [3]: heights = xr.Dataset(
          {'heights': (['kid_ids'], np.random.rand((3))*160)}, 
          coords={'kid_names':(['kid_ids'], ['carl','keith','gail']), 'kid_ids': [10,13,16]})

これにより、適切にマージされるように見える 2 つのデータ セットが作成されます。

In [4]: ages
Out[4]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 14 16
    kid_names  (kid_ids) <U5 'carl' 'kathy' 'gail'
Data variables:
    ages       (kid_ids) float64 13.28 1.955 4.327
In [5]: heights
Out[5]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 13 16
    kid_names  (kid_ids) <U5 'carl' 'keith' 'gail'
Data variables:
    heights    (kid_ids) float64 115.0 38.2 31.65

しかし、そうではありません-試行ages.merge(heights)すると次のことが発生しValueErrorます:

ValueError: conflicting value for variable kid_names:
first value: <xarray.Variable (kid_ids: 4)>
array(['carl', nan, 'kathy', 'gail'], dtype=object)
second value: <xarray.Variable (kid_ids: 4)>
array(['carl', 'keith', nan, 'gail'], dtype=object)

座標を削除kid_namesすると問題が解決します。

In [7]: ages.reset_coords('kid_names', drop=True).merge(
          heights.reset_coords('kid_names', drop=True))
Out[7]:
<xarray.Dataset>
Dimensions:  (kid_ids: 4)
Coordinates:
  * kid_ids  (kid_ids) int64 10 13 14 16
Data variables:
    ages     (kid_ids) float64 0.4473 nan 6.45 6.787
    heights  (kid_ids) float64 78.42 78.43 nan 113.4

座標が のように処理されているように見えますが、DataArrays値が異なるとエラーが発生します。しかし、2 つのインデックスのスーパーセットに拡張するなど、ベース座標のように扱うべきではありませんか? それとも、私がしなければならない別の操作がありますか?

私はxarray 0.7.2とnumpy 1.10.4を使用してpython 3.5を使用しています

4

2 に答える 2

6

これを xarray で実現するのは現在のところ簡単ではありませんが、実現できるはずです!

実際、ほとんどの状況では、競合しない値をマージしても安全だと思います (ユーザーがより厳しい精査を要求しない限り)。

これを追跡するために GitHub の問題を開きました: https://github.com/pydata/xarray/issues/835

更新:mergeメソッドはデフォルトでこれをサポートするcompat='no_conflicts'ようになったので (で)、ages.merge(heights)うまくいくはずです。

于 2016-04-20T07:12:58.710 に答える