2017-01-27 9 views
0

は考えIは、以下の例のように同じ寸法を有するいくつかの座標を有する:索引付けされていない座標の索引付け。

In [46]: ds = xarray.Dataset({"x": (("a", "b"), arange(25).reshape(5,5)+100), "y": ("b", arange(5)-100)}, {"a": arange(5), "b": arange(5)*2, "c": (("a",), list("ABCDE"))}) 

In [47]: print(ds) 
<xarray.Dataset> 
Dimensions: (a: 5, b: 5) 
Coordinates: 
    * b  (b) int64 0 2 4 6 8 
    c  (a) <U1 'A' 'B' 'C' 'D' 'E' 
    * a  (a) int64 0 1 2 3 4 
Data variables: 
    x  (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ... 
    y  (b) int64 -100 -99 -98 -97 -96 

座標aはインデックス(I名前で推測)のように認識されるが、しかしcではない座標。

In [48]: print(ds.loc[dict(a=slice(0, 2))]) 
<xarray.Dataset> 
Dimensions: (a: 3, b: 5) 
Coordinates: 
    * b  (b) int64 0 2 4 6 8 
    c  (a) <U1 'A' 'B' 'C' 
    * a  (a) int64 0 1 2 
Data variables: 
    x  (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ... 
    y  (b) int64 -100 -99 -98 -97 -96 

しかし、私は、インデックスc座標を使用していないことができます:私が使用してインデックスがaを調整することができ、

もちろん
In [49]: print(ds.loc[dict(c=slice("A", "C"))]) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-49-33483295fec4> in <module>() 
----> 1 print(ds.loc[dict(c=slice("A", "C"))]) 

/dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/dataset.py in __getitem__(self, key) 
    292   if not utils.is_dict_like(key): 
    293    raise TypeError('can only lookup dictionaries from Dataset.loc') 
--> 294   return self.dataset.sel(**key) 
    295 
    296 

/dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/dataset.py in sel(self, method, tolerance, drop, **indexers) 
    1180   """ 
    1181   pos_indexers, new_indexes = indexing.remap_label_indexers(
-> 1182    self, indexers, method=method, tolerance=tolerance 
    1183  ) 
    1184   result = self.isel(drop=drop, **pos_indexers) 

/dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/indexing.py in remap_label_indexers(data_obj, indexers, method, tolerance) 
    273  new_indexes = {} 
    274 
--> 275  dim_indexers = get_dim_indexers(data_obj, indexers) 
    276  for dim, label in iteritems(dim_indexers): 
    277   try: 

/dev/shm/gerrit/venv/stable-3.5/lib/python3.5/site-packages/xarray/core/indexing.py in get_dim_indexers(data_obj, indexers) 
    241  if invalid: 
    242   raise ValueError("dimensions or multi-index levels %r do not exist" 
--> 243       % invalid) 
    244 
    245  level_indexers = defaultdict(dict) 

ValueError: dimensions or multi-index levels ['c'] do not exist 

が、私はからcaへのブール配列を渡すことができ

In [61]: ds.loc[dict(a=((ds.c>='A') & (ds.c<='C')))] 
Out[61]: 
<xarray.Dataset> 
Dimensions: (a: 3, b: 5) 
Coordinates: 
    * b  (b) int64 0 2 4 6 8 
    c  (a) <U1 'A' 'B' 'C' 
    * a  (a) int64 0 1 2 
Data variables: 
    x  (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ... 
    y  (b) int64 -100 -99 -98 -97 -96 

を使用するか、whereメソッドを使用してください(これは副作用がありますがds['y']いずれもデータ変数で動作しますが、大きい場合(?)、

In [57]: ds.where((ds.c>='A') & (ds.c<='C'), drop=True) 
Out[57]: 
<xarray.Dataset> 
Dimensions: (a: 3, b: 5) 
Coordinates: 
    * b  (b) int64 0 2 4 6 8 
    c  (a) <U1 'A' 'B' 'C' 
    * a  (a) int64 0 1 2 
Data variables: 
    x  (a, b) float64 100.0 101.0 102.0 103.0 104.0 105.0 106.0 107.0 ... 
    y  (b, a) float64 -100.0 -100.0 -100.0 -99.0 -99.0 -99.0 -98.0 ... 

索引付けされていない座標とデータ変数の間には実用的な違いがありますか? cのステータスをインデックスの座標として使用することはできますか、データ変数の場合と同様にラウンドアバウトの方法に頼る必要はありますか?

答えて

0

それはset a new indexすることも可能である:

In [67]: print(ds.set_index(a='c').loc[dict(a=slice('A', 'C'))]) 
<xarray.Dataset> 
Dimensions: (a: 3, b: 5) 
Coordinates: 
    * b  (b) int64 0 2 4 6 8 
    * a  (a) object 'A' 'B' 'C' 
Data variables: 
    x  (a, b) int64 100 101 102 103 104 105 106 107 108 109 110 111 ... 
    y  (b) int64 -100 -99 -98 -97 -96 

これはおそらく、問題の二つの選択肢よりも少しクリーナーです。

関連する問題