Skip to content

Commit 83bef5e

Browse files
committed
Merge pull request #694 from shoyer/strict-reindex
Check that dimensions are all valid when using reindex
2 parents 1219ec2 + 3a8896e commit 83bef5e

File tree

5 files changed

+25
-5
lines changed

5 files changed

+25
-5
lines changed

xray/core/alignment.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,12 @@ def align(*objects, **kwargs):
8484
% list(kwargs))
8585

8686
joined_indexes = _join_indexes(join, objects)
87-
return tuple(obj.reindex(copy=copy, **joined_indexes) for obj in objects)
87+
result = []
88+
for obj in objects:
89+
valid_indexers = dict((k, v) for k, v in joined_indexes.items()
90+
if k in obj.dims)
91+
result.append(obj.reindex(copy=copy, **valid_indexers))
92+
return tuple(result)
8893

8994

9095
def partial_align(*objects, **kwargs):

xray/core/dataarray.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,10 @@ def reindex_like(self, other, method=None, tolerance=None, copy=True):
659659
DataArray.reindex
660660
align
661661
"""
662+
indexers = dict((k, v) for k, v in other.indexes.items()
663+
if k in self.dims)
662664
return self.reindex(method=method, tolerance=tolerance, copy=copy,
663-
**other.indexes)
665+
**indexers)
664666

665667
def reindex(self, method=None, tolerance=None, copy=True, **indexers):
666668
"""Conform this object onto a new set of indexes, filling in

xray/core/dataset.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1154,8 +1154,10 @@ def reindex_like(self, other, method=None, tolerance=None, copy=True):
11541154
Dataset.reindex
11551155
align
11561156
"""
1157+
indexers = dict((k, v) for k, v in other.indexes.items()
1158+
if k in self.dims)
11571159
return self.reindex(method=method, copy=copy, tolerance=tolerance,
1158-
**other.indexes)
1160+
**indexers)
11591161

11601162
def reindex(self, indexers=None, method=None, tolerance=None, copy=True, **kw_indexers):
11611163
"""Conform this object onto a new set of indexes, filling in
@@ -1205,6 +1207,10 @@ def reindex(self, indexers=None, method=None, tolerance=None, copy=True, **kw_in
12051207
# shortcut
12061208
return self.copy(deep=True) if copy else self
12071209

1210+
bad_dims = [d for d in indexers if d not in self.dims]
1211+
if bad_dims:
1212+
raise ValueError('invalid reindex dimensions: %s' % bad_dims)
1213+
12081214
variables = alignment.reindex_variables(
12091215
self.variables, self.indexes, indexers, method, tolerance, copy=copy)
12101216
return self._replace_vars_and_dims(variables)

xray/core/merge.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,11 @@ def _reindex_variables_against(variables, indexes, copy=False):
151151
"""Reindex all DataArrays in the provided dict, leaving other values alone.
152152
"""
153153
alignable = [k for k, v in variables.items() if hasattr(v, 'indexes')]
154-
aligned = [variables[a].reindex(copy=copy, **indexes)
155-
for a in alignable]
154+
aligned = []
155+
for a in alignable:
156+
valid_indexes = dict((k, v) for k, v in indexes.items()
157+
if k in variables[a].dims)
158+
aligned.append(variables[a].reindex(copy=copy, **valid_indexes))
156159
new_variables = OrderedDict(variables)
157160
new_variables.update(zip(alignable, aligned))
158161
return new_variables

xray/test/test_dataset.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,10 @@ def test_reindex(self):
881881
with self.assertRaisesRegexp(ValueError, 'dictionary'):
882882
data.reindex('foo')
883883

884+
# invalid dimension
885+
with self.assertRaisesRegexp(ValueError, 'invalid reindex dim'):
886+
data.reindex(invalid=0)
887+
884888
# out of order
885889
expected = data.sel(dim1=data['dim1'][:10:-1])
886890
actual = data.reindex(dim1=data['dim1'][:10:-1])

0 commit comments

Comments
 (0)