diff --git a/src/rasterix/raster_index.py b/src/rasterix/raster_index.py index 6731567..b700f7e 100644 --- a/src/rasterix/raster_index.py +++ b/src/rasterix/raster_index.py @@ -201,14 +201,10 @@ def generate_coords(self, dims: tuple[str, ...] | None = None) -> dict[Hashable, return self.forward({self.dim: np.arange(self.size)}) def slice(self, slice: slice) -> AxisAffineTransform: - start = max(slice.start or 0, 0) - stop = min(slice.stop or self.size, self.size) - step = slice.step or 1 - - # TODO: support reverse transform (i.e., start > stop)? - assert start < stop - - size = (stop - start) // step + newrange = range(self.size)[slice] + start = newrange.start + step = newrange.step or 1 + size = len(newrange) scale = float(step) if self.is_xaxis: diff --git a/tests/test_raster_index.py b/tests/test_raster_index.py index 4c42826..d5af821 100644 --- a/tests/test_raster_index.py +++ b/tests/test_raster_index.py @@ -69,6 +69,18 @@ def test_sel_slice(): assert actual_transform == actual.rio.transform() assert actual_transform == (transform * Affine.translation(0, 3)) + reverse = ds.isel(y=slice(None, None, -1)) + assert_identical(reverse.y, ds.y[::-1]) + + reverse = ds.isel(y=slice(8, 5, -1)) + assert_identical(reverse.y, ds.y[8:5:-1]) + + reverse = ds.isel(y=slice(8, None, -1)) + assert_identical(reverse.y, ds.y[8::-1]) + + reverse = ds.isel(y=slice(None, 5, -1)) + assert_identical(reverse.y, ds.y[:5:-1]) + def test_crs() -> None: index = RasterIndex.from_transform(Affine.identity(), width=12, height=10)