Skip to content

Commit aa59ec0

Browse files
authored
Support reversing with isel (#48)
1 parent 5413143 commit aa59ec0

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/rasterix/raster_index.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,10 @@ def generate_coords(self, dims: tuple[str, ...] | None = None) -> dict[Hashable,
201201
return self.forward({self.dim: np.arange(self.size)})
202202

203203
def slice(self, slice: slice) -> AxisAffineTransform:
204-
start = max(slice.start or 0, 0)
205-
stop = min(slice.stop or self.size, self.size)
206-
step = slice.step or 1
207-
208-
# TODO: support reverse transform (i.e., start > stop)?
209-
assert start < stop
210-
211-
size = (stop - start) // step
204+
newrange = range(self.size)[slice]
205+
start = newrange.start
206+
step = newrange.step or 1
207+
size = len(newrange)
212208
scale = float(step)
213209

214210
if self.is_xaxis:

tests/test_raster_index.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,18 @@ def test_sel_slice():
6969
assert actual_transform == actual.rio.transform()
7070
assert actual_transform == (transform * Affine.translation(0, 3))
7171

72+
reverse = ds.isel(y=slice(None, None, -1))
73+
assert_identical(reverse.y, ds.y[::-1])
74+
75+
reverse = ds.isel(y=slice(8, 5, -1))
76+
assert_identical(reverse.y, ds.y[8:5:-1])
77+
78+
reverse = ds.isel(y=slice(8, None, -1))
79+
assert_identical(reverse.y, ds.y[8::-1])
80+
81+
reverse = ds.isel(y=slice(None, 5, -1))
82+
assert_identical(reverse.y, ds.y[:5:-1])
83+
7284

7385
def test_crs() -> None:
7486
index = RasterIndex.from_transform(Affine.identity(), width=12, height=10)

0 commit comments

Comments
 (0)