Skip to content

Commit f778624

Browse files
authored
Fix RangeIndex slicing (#10471)
1 parent 55dc766 commit f778624

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

xarray/indexes/range_index.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from xarray.core.coordinate_transform import CoordinateTransform
1010
from xarray.core.dataarray import DataArray
1111
from xarray.core.indexes import CoordinateTransformIndex, Index, PandasIndex
12-
from xarray.core.indexing import IndexSelResult, normalize_slice
12+
from xarray.core.indexing import IndexSelResult
1313
from xarray.core.variable import Variable
1414

1515

@@ -79,14 +79,10 @@ def equals(
7979
)
8080

8181
def slice(self, sl: slice) -> "RangeCoordinateTransform":
82-
sl = normalize_slice(sl, self.size)
83-
84-
# TODO: support reverse transform (i.e., start > stop)?
85-
assert sl.start < sl.stop
86-
87-
new_size = (sl.stop - sl.start) // sl.step
88-
new_start = self.start + sl.start * self.step
89-
new_stop = new_start + new_size * sl.step * self.step
82+
new_range = range(self.size)[sl]
83+
new_size = len(new_range)
84+
new_start = self.start + new_range.start * self.step
85+
new_stop = self.start + new_range.stop * self.step
9086

9187
return type(self)(
9288
new_start, new_stop, new_size, self.coord_name, self.dim, dtype=self.dtype

xarray/tests/test_range_index.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,28 @@ def test_range_index_isel() -> None:
121121
expected = create_dataset_arange(0.0, 1.0, 0.2)
122122
assert_identical(actual, expected, check_default_indexes=False)
123123

124+
actual = ds.isel(x=slice(None, None, -1))
125+
expected = create_dataset_arange(0.9, -0.1, -0.1)
126+
assert_identical(actual, expected, check_default_indexes=False)
127+
128+
actual = ds.isel(x=slice(None, 4, -1))
129+
expected = create_dataset_arange(0.9, 0.4, -0.1)
130+
assert_identical(actual, expected, check_default_indexes=False)
131+
132+
actual = ds.isel(x=slice(8, 4, -1))
133+
expected = create_dataset_arange(0.8, 0.4, -0.1)
134+
assert_identical(actual, expected, check_default_indexes=False)
135+
136+
actual = ds.isel(x=slice(8, None, -1))
137+
expected = create_dataset_arange(0.8, -0.1, -0.1)
138+
assert_identical(actual, expected, check_default_indexes=False)
139+
140+
# https://github.com/pydata/xarray/issues/10441
141+
ds2 = create_dataset_arange(0.0, 3.0, 0.1)
142+
actual = ds2.isel(x=slice(4, None, 3))
143+
expected = create_dataset_arange(0.4, 3.0, 0.3)
144+
assert_identical(actual, expected, check_default_indexes=False)
145+
124146
# scalar
125147
actual = ds.isel(x=0)
126148
expected = xr.Dataset(coords={"x": 0.0})

0 commit comments

Comments
 (0)