2016-08-08 64 views
0

非常に単純な質問ですが、私は答えをオンラインで見つけることができません。私はDatasetを持っていて、ちょうどそれにDataArrayという名前を付け加えたいと思います。何かのようなdataset.add({"new_array": new_data_array})。私は約mergeupdateconcatenateを知っているが、私の理解では、mergeが二つ以上のDataset Sをマージするためのものであり、concatenateは別のDataArrayを形成するために、2つ以上のDataArray秒を連結するためのものであることである、と私はかなり完全にまだupdateを理解していません。 dataset.update({"new_array": new_data_array})を試しましたが、次のエラーが表示されます。Python XarrayがデータセットにDataArrayを追加

InvalidIndexError: Reindexing only valid with uniquely valued Index objects 

私もdataset["new_array"] = new_data_arrayを試しましたが、同じエラーが発生します。

更新

私は今の問題は、私の座標のいくつかは、私は知りませんでした重複した値を、持っていることであることが判明しました。座標はインデックスとして使用されるため、Xarrayは共有座標を結合しようとすると混乱します(分かりやすく)。以下は動作する例です。

names = ["joaquin", "manolo", "xavier"] 
n = xarray.DataArray([23, 98, 23], coords={"name": names}) 
print(n) 
print("======") 
m = numpy.random.randint(0, 256, (3, 4, 4)).astype(numpy.uint8) 
mm = xarray.DataArray(m, dims=["name", "row", "column"], coords=[names, range(4), range(4)]) 
print(mm) 
print("======") 
n_dataset = n.rename("number").to_dataset() 
n_dataset["mm"] = mm 
print(n_dataset) 

出力:

<xarray.DataArray (name: 3)> 
array([23, 98, 23]) 
Coordinates: 
    * name  (name) <U7 'joaquin' 'manolo' 'xavier' 
====== 
<xarray.DataArray (name: 3, row: 4, column: 4)> 
array([[[ 55, 63, 250, 211], 
     [204, 151, 164, 237], 
     [182, 24, 211, 12], 
     [183, 220, 35, 78]], 

     [[208, 7, 91, 114], 
     [195, 30, 108, 130], 
     [ 61, 224, 105, 125], 
     [ 65, 1, 132, 137]], 

     [[ 52, 137, 62, 206], 
     [188, 160, 156, 126], 
     [145, 223, 103, 240], 
     [141, 38, 43, 68]]], dtype=uint8) 
Coordinates: 
    * name  (name) <U7 'joaquin' 'manolo' 'xavier' 
    * row  (row) int64 0 1 2 3 
    * column (column) int64 0 1 2 3 
====== 
<xarray.Dataset> 
Dimensions: (column: 4, name: 3, row: 4) 
Coordinates: 
    * name  (name) object 'joaquin' 'manolo' 'xavier' 
    * row  (row) int64 0 1 2 3 
    * column (column) int64 0 1 2 3 
Data variables: 
    number (name) int64 23 98 23 
    mm  (name, row, column) uint8 55 63 250 211 204 151 164 237 182 24 ... 

上記のコードでは、インデックスとしてnames使用。コードを少し変更してnamesに重複があるとしたら、names = ["joaquin", "manolo", "joaquin"]と入力すると、InvalidIndexErrorとなります。

コード:

names = ["joaquin", "manolo", "joaquin"] 
n = xarray.DataArray([23, 98, 23], coords={"name": names}) 
print(n) 
print("======") 
m = numpy.random.randint(0, 256, (3, 4, 4)).astype(numpy.uint8) 
mm = xarray.DataArray(m, dims=["name", "row", "column"], coords=[names, range(4), range(4)]) 
print(mm) 
print("======") 
n_dataset = n.rename("number").to_dataset() 
n_dataset["mm"] = mm 
print(n_dataset) 

が出力:

<xarray.DataArray (name: 3)> 
array([23, 98, 23]) 
Coordinates: 
    * name  (name) <U7 'joaquin' 'manolo' 'joaquin' 
====== 
<xarray.DataArray (name: 3, row: 4, column: 4)> 
array([[[247, 3, 20, 141], 
     [ 54, 111, 224, 56], 
     [144, 117, 131, 192], 
     [230, 44, 174, 14]], 

     [[225, 184, 170, 248], 
     [ 57, 105, 165, 70], 
     [220, 228, 238, 17], 
     [ 90, 118, 87, 30]], 

     [[158, 211, 31, 212], 
     [ 63, 172, 190, 254], 
     [165, 163, 184, 22], 
     [ 49, 224, 196, 244]]], dtype=uint8) 
Coordinates: 
    * name  (name) <U7 'joaquin' 'manolo' 'joaquin' 
    * row  (row) int64 0 1 2 3 
    * column (column) int64 0 1 2 3 
====== 
--------------------------------------------------------------------------- 
InvalidIndexError       Traceback (most recent call last) 
<ipython-input-12-50863379cefe> in <module>() 
     8 print("======") 
     9 n_dataset = n.rename("number").to_dataset() 
---> 10 n_dataset["mm"] = mm 
    11 print(n_dataset) 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/dataset.py in __setitem__(self, key, value) 
    536    raise NotImplementedError('cannot yet use a dictionary as a key ' 
    537          'to set Dataset values') 
--> 538   self.update({key: value}) 
    539 
    540  def __delitem__(self, key): 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/dataset.py in update(self, other, inplace) 
    1434    dataset. 
    1435   """ 
-> 1436   variables, coord_names, dims = dataset_update_method(self, other) 
    1437 
    1438   return self._replace_vars_and_dims(variables, coord_names, dims, 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/merge.py in dataset_update_method(dataset, other) 
    492  priority_arg = 1 
    493  indexes = dataset.indexes 
--> 494  return merge_core(objs, priority_arg=priority_arg, indexes=indexes) 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/merge.py in merge_core(objs, compat, join, priority_arg, explicit_coords, indexes) 
    373  coerced = coerce_pandas_values(objs) 
    374  aligned = deep_align(coerced, join=join, copy=False, indexes=indexes, 
--> 375       skip_single_target=True) 
    376  expanded = expand_variable_dicts(aligned) 
    377 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/alignment.py in deep_align(list_of_variable_maps, join, copy, indexes, skip_single_target) 
    162 
    163  aligned = partial_align(*targets, join=join, copy=copy, indexes=indexes, 
--> 164        skip_single_target=skip_single_target) 
    165 
    166  for key, aligned_obj in zip(keys, aligned): 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/alignment.py in partial_align(*objects, **kwargs) 
    122   valid_indexers = dict((k, v) for k, v in joined_indexes.items() 
    123        if k in obj.dims) 
--> 124   result.append(obj.reindex(copy=copy, **valid_indexers)) 
    125 
    126  return tuple(result) 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/dataset.py in reindex(self, indexers, method, tolerance, copy, **kw_indexers) 
    1216 
    1217   variables = alignment.reindex_variables(
-> 1218    self.variables, self.indexes, indexers, method, tolerance, copy=copy) 
    1219   return self._replace_vars_and_dims(variables) 
    1220 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/xarray/core/alignment.py in reindex_variables(variables, indexes, indexers, method, tolerance, copy) 
    234    target = utils.safe_cast_to_index(indexers[name]) 
    235    indexer = index.get_indexer(target, method=method, 
--> 236           **get_indexer_kwargs) 
    237 
    238    to_shape[name] = len(target) 

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/indexes/base.py in get_indexer(self, target, method, limit, tolerance) 
    2080 
    2081   if not self.is_unique: 
-> 2082    raise InvalidIndexError('Reindexing only valid with uniquely' 
    2083          ' valued Index objects') 
    2084 

InvalidIndexError: Reindexing only valid with uniquely valued Index objects 

だから、のようなXarrayのバグではありません。それにもかかわらず、私はこのバグを見つけようと多くの時間を無駄にしていました。私はXarrayの協力者がすぐにこれを修正することを願っています。 (マージしようとする前に座標の一意性チェックを入れてください。)

いずれにしても、以下の私の答えで提供されている方法はまだ動作します。

+0

もっと完全な例を共有できますか?同様のエラー(現在修正済み)を引き起こした小さな回帰がありました。しかし、何が起きているのかは明らかではありません。 – Maximilian

+0

xarray v0.8.0を使用していますか?このエラーを誤って引き起こしたバグがあり、v0.8.1で修正されました。 – shoyer

+0

私は現在0.8.1に更新されていますが、同じエラーが発生しています。 @ jetesdalの答えでサンプルコードを試してみましたが、それはうまくいきますが、なんらかの理由でそれが自分のコードではうまくいきません。私のコードはあまりにも巨大で(そしてあまりにも秘密で)ここに貼り付けることはできません。簡単な例を書くのは良いことです。 – Ray

答えて

0

[OK]私はそれを行う方法を見つけましたが、これが正規の方法か最善の方法であるかわかりませんので、批判して助言してください。それはそれを行う良い方法のように感じません。

dataset = xarray.merge([dataset, new_data_array.rename("new_array")]) 
3

新しいDataArrayのサイズがデータセットのサイズと同じであることを確認する必要があります。その後、次の作業をする必要があります。ここでは

dataset['new_array_name'] = new_array 

はそれを試してみるための完全な例である:あなたの詳細レポートへ

# Create some dimensions 
x = np.linspace(-10,10,10) 
y = np.linspace(-20,20,20) 
(yy, xx) = np.meshgrid(y,x) 

# Make two different DataArrays with equal dimensions 
var1 = xray.DataArray(np.random.randn(len(x),len(y)),coords=[x, y],dims=['x','y']) 
var2 = xray.DataArray(-xx**2+yy**2,coords=[x, y],dims=['x','y']) 

# Save one DataArray as dataset 
ds = var1.to_dataset(name = 'var1') 

# Add second DataArray to existing dataset (ds) 
ds['var2'] = var2 
+0

これは適切な解決策ですが、新しいDataArrayまたはラベルの寸法について何も保証する必要はありません。 Xarrayは、挿入すると自動的に整列します。 – shoyer

+0

@jetesdalありがとうございますが、私のコードはまだ動作しません。あなたのものは(私はそれをコピーして貼り付ける)。非常に奇妙な。 – Ray

2

おかげで、この問題は、今xarrayの最新リリース(V0で修正されています8.2)。

我々は二つの方法で行動を固定:xarrayオブジェクト間の

  1. アライメント作業は今限り、非ユニークインデックスがすべてのオブジェクトに同じ値を取るよう、でも非一意索引で成功。

  2. あなたはが同一でない、あなたが今、重複する値を持つインデックスの名前を報告する有益なエラーメッセージが出ている非一意索引、例えば、​​でオブジェクトを整列しようとすると

関連する問題