Skip to content

Commit 0794f41

Browse files
HasanAhmadQ7HasanAhmadQ7
HasanAhmadQ7
authored and
HasanAhmadQ7
committed
BUG fix +test .sel method gives error with float32 values
.sel method gives error when it is used to select float32 values Resolves: #3137
1 parent 118f4d9 commit 0794f41

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

xarray/core/dataset.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1814,8 +1814,9 @@ def sel(self, indexers=None, method=None, tolerance=None, drop=False,
18141814
DataArray.sel
18151815
"""
18161816
indexers = either_dict_or_kwargs(indexers, indexers_kwargs, 'sel')
1817+
casted_indexers = self._maybe_cast_floats(indexers)
18171818
pos_indexers, new_indexes = remap_label_indexers(
1818-
self, indexers=indexers, method=method, tolerance=tolerance)
1819+
self, indexers=casted_indexers, method=method, tolerance=tolerance)
18191820
result = self.isel(indexers=pos_indexers, drop=drop)
18201821
return result._overwrite_indexes(new_indexes)
18211822

@@ -2322,6 +2323,22 @@ def interp_like(self, other, method='linear', assume_sorted=False,
23222323
ds = self.reindex(object_coords)
23232324
return ds.interp(numeric_coords, method, assume_sorted, kwargs)
23242325

2326+
# Helper method for sel()
2327+
def _maybe_cast_floats(self, indexers):
2328+
""" Cast float labels passed to sel() method to the float
2329+
types of the corresponding coordinates"""
2330+
from .dataarray import DataArray
2331+
casted_indexers = indexers.copy()
2332+
for k, v in indexers.items():
2333+
coords_var = self.coords[k].values
2334+
if isinstance(indexers[k], (slice, DataArray, Variable)):
2335+
pass
2336+
elif (isinstance(coords_var, np.ndarray) and
2337+
coords_var.dtype.kind == 'f'):
2338+
casting_type = getattr(coords_var.dtype, "type")
2339+
casted_indexers[k] = casting_type(indexers[k])
2340+
return casted_indexers
2341+
23252342
# Helper methods for rename()
23262343
def _rename_vars(self, name_dict, dims_dict):
23272344
variables = OrderedDict()

xarray/tests/test_dataarray.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,16 @@ def test_sel_dataarray_datetime(self):
817817
result = array.sel(delta=slice(array.delta[0], array.delta[-1]))
818818
assert_equal(result, array)
819819

820+
def test_sel_float32(self):
821+
float_values = [0., 0.111, 0.222, 0.333]
822+
coord_values = np.asarray(float_values, dtype='float32')
823+
data_values = np.arange(4)
824+
array = DataArray(data_values, [('float32_coord', coord_values)])
825+
expected = DataArray(data_values[1:3], [('float32_coord',
826+
coord_values[1:3])])
827+
actual = array.sel(float32_coord=float_values[1:3])
828+
assert_equal(expected, actual)
829+
820830
def test_sel_no_index(self):
821831
array = DataArray(np.arange(10), dims='x')
822832
assert_identical(array[0], array.sel(x=0))

0 commit comments

Comments
 (0)