Skip to content

Commit 94b08a3

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 23fc0d6 commit 94b08a3

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

xarray/core/dataset.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1778,8 +1778,9 @@ def sel(self, indexers=None, method=None, tolerance=None, drop=False,
17781778
DataArray.sel
17791779
"""
17801780
indexers = either_dict_or_kwargs(indexers, indexers_kwargs, 'sel')
1781+
casted_indexers = self._maybe_cast_floats(indexers)
17811782
pos_indexers, new_indexes = remap_label_indexers(
1782-
self, indexers=indexers, method=method, tolerance=tolerance)
1783+
self, indexers=casted_indexers, method=method, tolerance=tolerance)
17831784
result = self.isel(indexers=pos_indexers, drop=drop)
17841785
return result._overwrite_indexes(new_indexes)
17851786

@@ -2262,6 +2263,17 @@ def interp_like(self, other, method='linear', assume_sorted=False,
22622263
ds = self.reindex(object_coords)
22632264
return ds.interp(numeric_coords, method, assume_sorted, kwargs)
22642265

2266+
# Helper method for sel()
2267+
def _maybe_cast_floats(self, indexers):
2268+
""" Cast float labels passed to sel() method to the float
2269+
types of the corresponding coordinates"""
2270+
casted_indexers = indexers.copy()
2271+
for k, v in indexers.items():
2272+
if self.coords[k].dtype.kind == 'f':
2273+
casting_type = getattr(self.coords[k].dtype, "type")
2274+
casted_indexers[k] = casting_type(indexers[k])
2275+
return casted_indexers
2276+
22652277
# Helper methods for rename()
22662278
def _rename_vars(self, name_dict, dims_dict):
22672279
variables = OrderedDict()

xarray/tests/test_dataarray.py

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

804+
def test_sel_float32(self):
805+
float_values = [0., 0.111, 0.222, 0.333]
806+
coord_values = np.asarray(float_values, dtype='float32')
807+
data_values = np.arange(4)
808+
array = DataArray(data_values, [('float32_coord', coord_values)])
809+
expected = DataArray(data_values[1:3], [('float32_coord',
810+
coord_values[1:3])])
811+
actual = array.sel(float32_coord=float_values[1:3])
812+
assert_equal(expected, actual)
813+
804814
def test_sel_no_index(self):
805815
array = DataArray(np.arange(10), dims='x')
806816
assert_identical(array[0], array.sel(x=0))

0 commit comments

Comments
 (0)