Skip to content

Commit e0569dc

Browse files
author
Benoit Bovy
committed
refactored and fixed dim name / coord replacement
1 parent 1a8305a commit e0569dc

File tree

2 files changed

+17
-29
lines changed

2 files changed

+17
-29
lines changed

xarray/core/dataarray.py

+7-15
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,14 @@ def _remap_key(self, key):
9090
# expand the indexer so we can handle Ellipsis
9191
labels = indexing.expanded_indexer(key, self.data_array.ndim)
9292
key = dict(zip(self.data_array.dims, labels))
93-
9493
return indexing.remap_label_indexers(self.data_array, key)
9594

9695
def __getitem__(self, key):
9796
pos_indexers, new_indexes = self._remap_key(key)
98-
return self.data_array[pos_indexers]._replace_indexes(new_indexes)
97+
ds = self.data_array[pos_indexers]._to_temp_dataset()
98+
return self.data_array._from_temp_dataset(
99+
ds._replace_indexes(new_indexes)
100+
)
99101

100102
def __setitem__(self, key, value):
101103
pos_indexers, new_indexes = self._remap_key(key)
@@ -240,16 +242,6 @@ def _replace_maybe_drop_dims(self, variable, name=__default):
240242
if set(v.dims) <= allowed_dims)
241243
return self._replace(variable, coords, name)
242244

243-
def _replace_indexes(self, indexes):
244-
obj = self
245-
for dim, idx in iteritems(indexes):
246-
if idx.name is None:
247-
idx.name = dim + "_unnamed_level"
248-
obj = obj.rename({dim: idx.name})
249-
new_coord = Coordinate(idx.name, idx)
250-
obj = obj._replace(coords={idx.name: new_coord})
251-
return obj
252-
253245
__this_array = _ThisArray()
254246

255247
def _to_temp_dataset(self):
@@ -605,10 +597,10 @@ def sel(self, method=None, tolerance=None, **indexers):
605597
Dataset.sel
606598
DataArray.isel
607599
"""
608-
pos_indexers, new_indexes = indexing.remap_label_indexers(
609-
self, indexers, method=method, tolerance=tolerance
600+
ds = self._to_temp_dataset().sel(
601+
method=method, tolerance=tolerance, **indexers
610602
)
611-
return self.isel(**pos_indexers)._replace_indexes(new_indexes)
603+
return self._from_temp_dataset(ds)
612604

613605
def isel_points(self, dim='points', **indexers):
614606
"""Return a new DataArray whose dataset is given by pointwise integer

xarray/core/dataset.py

+10-14
Original file line numberDiff line numberDiff line change
@@ -420,20 +420,16 @@ def _replace_vars_and_dims(self, variables, coord_names=None,
420420
return obj
421421

422422
def _replace_indexes(self, indexes):
423-
obj = self
424-
for dim, idx in iteritems(indexes):
425-
if idx.name is None:
426-
idx.name = dim + "_unnamed_level"
427-
obj = obj.rename({dim: idx.name})
428-
new_coord = Coordinate(idx.name, idx)
429-
variables = OrderedDict()
430-
for k, v in iteritems(obj._variables):
431-
if k == idx.name:
432-
variables[k] = new_coord
433-
else:
434-
variables[k] = v
435-
obj = obj._replace_vars_and_dims(variables)
436-
return obj
423+
variables = OrderedDict()
424+
for k, v in iteritems(self._variables):
425+
if k in indexes.keys():
426+
idx = indexes[k]
427+
variables[k] = Coordinate(idx.name, idx)
428+
else:
429+
variables[k] = v
430+
obj = self._replace_vars_and_dims(variables)
431+
dim_names = {dim: idx.name for dim, idx in iteritems(indexes)}
432+
return obj.rename(dim_names)
437433

438434
def copy(self, deep=False):
439435
"""Returns a copy of this dataset.

0 commit comments

Comments
 (0)