Skip to content

Commit 994e329

Browse files
committed
Fix indexing empty slices
1 parent 662ceef commit 994e329

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

src/zarr/core/indexing.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,8 @@ def __init__(
428428

429429
def __iter__(self) -> Iterator[ChunkDimProjection]:
430430
# figure out the range of chunks we need to visit
431+
if self.start >= self.stop:
432+
return # empty slice
431433
g = self.dim_grid
432434
dim_chunk_ix_from = g.index_to_chunk(self.start) if self.start > 0 else 0
433435
dim_chunk_ix_to = g.index_to_chunk(self.stop - 1) + 1 if self.stop > 0 else 0

tests/test_unified_chunk_grid.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2556,6 +2556,21 @@ def test_int_array_indexer_varying_boundary(self) -> None:
25562556
assert isinstance(sel, np.ndarray)
25572557
np.testing.assert_array_equal(sel, [1])
25582558

2559+
def test_slice_indexer_empty_slice_at_boundary(self) -> None:
2560+
"""SliceDimIndexer yields no projections for an empty slice at the dimension boundary."""
2561+
from zarr.core.indexing import SliceDimIndexer
2562+
2563+
dim = FixedDimension(size=2, extent=10)
2564+
# slice(10, 10) is empty — start equals extent
2565+
indexer = SliceDimIndexer(slice(10, 10), 10, dim)
2566+
projections = list(indexer)
2567+
assert len(projections) == 0
2568+
2569+
# also works for VaryingDimension
2570+
dim_v = VaryingDimension([5, 5], extent=10)
2571+
indexer_v = SliceDimIndexer(slice(10, 10), 10, dim_v)
2572+
assert list(indexer_v) == []
2573+
25592574
def test_orthogonal_indexer_varying_boundary_advanced(self) -> None:
25602575
"""OrthogonalIndexer with advanced indexing uses per-chunk chunk_size
25612576
for ix_() conversion, not a precomputed max."""

0 commit comments

Comments
 (0)