Skip to content

Commit 3816901

Browse files
benbovydcherian
andauthored
Add RangeIndex (#10076)
Co-authored-by: Deepak Cherian <dcherian@users.noreply.github.com>
1 parent 969d991 commit 3816901

File tree

12 files changed

+695
-21
lines changed

12 files changed

+695
-21
lines changed

doc/api-hidden.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,10 @@
530530
Index.rename
531531
Index.copy
532532

533+
indexes.RangeIndex.start
534+
indexes.RangeIndex.stop
535+
indexes.RangeIndex.step
536+
533537
backends.NetCDF4DataStore.close
534538
backends.NetCDF4DataStore.encode
535539
backends.NetCDF4DataStore.encode_attribute

doc/api.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,6 +1573,7 @@ Custom Indexes
15731573
:toctree: generated/
15741574

15751575
CFTimeIndex
1576+
indexes.RangeIndex
15761577

15771578
Creating custom indexes
15781579
-----------------------
@@ -1582,6 +1583,8 @@ Creating custom indexes
15821583
cftime_range
15831584
date_range
15841585
date_range_like
1586+
indexes.RangeIndex.arange
1587+
indexes.RangeIndex.linspace
15851588

15861589
Tutorial
15871590
========

doc/whats-new.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,11 @@ Andrecho, Deepak Cherian, Ian Hunt-Isaak, Karl Krauth, Mathias Hauser, Maximilia
6262

6363
New Features
6464
~~~~~~~~~~~~
65-
6665
- Allow setting a ``fill_value`` for Zarr format 3 arrays. Specify ``fill_value`` in ``encoding`` as usual.
6766
(:issue:`10064`). By `Deepak Cherian <https://github.com/dcherian>`_.
67+
- Added :py:class:`indexes.RangeIndex` as an alternative, memory saving Xarray index representing
68+
a 1-dimensional bounded interval with evenly spaced floating values (:issue:`8473`, :pull:`10076`).
69+
By `Benoit Bovy <https://github.com/benbovy>`_.
6870

6971
Breaking changes
7072
~~~~~~~~~~~~~~~~

xarray/core/formatting.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ def inline_variable_array_repr(var, max_width):
312312
def summarize_variable(
313313
name: Hashable,
314314
var: Variable,
315-
col_width: int,
315+
col_width: int | None = None,
316316
max_width: int | None = None,
317317
is_index: bool = False,
318318
):
@@ -327,7 +327,9 @@ def summarize_variable(
327327
max_width = max_width_options
328328

329329
marker = "*" if is_index else " "
330-
first_col = pretty_print(f" {marker} {name} ", col_width)
330+
first_col = f" {marker} {name} "
331+
if col_width is not None:
332+
first_col = pretty_print(first_col, col_width)
331333

332334
if variable.dims:
333335
dims_str = "({}) ".format(", ".join(map(str, variable.dims)))

xarray/core/indexes.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,8 +1500,21 @@ def rename(
15001500
name_dict: Mapping[Any, Hashable],
15011501
dims_dict: Mapping[Any, Hashable],
15021502
) -> Self:
1503-
# TODO: maybe update self.transform coord_names, dim_size and dims attributes
1504-
return self
1503+
coord_names = self.transform.coord_names
1504+
dims = self.transform.dims
1505+
dim_size = self.transform.dim_size
1506+
1507+
if not set(coord_names) & set(name_dict) and not set(dims) & set(dims_dict):
1508+
return self
1509+
1510+
new_transform = copy.deepcopy(self.transform)
1511+
new_transform.coord_names = tuple(name_dict.get(n, n) for n in coord_names)
1512+
new_transform.dims = tuple(str(dims_dict.get(d, d)) for d in dims)
1513+
new_transform.dim_size = {
1514+
str(dims_dict.get(d, d)): v for d, v in dim_size.items()
1515+
}
1516+
1517+
return type(self)(new_transform)
15051518

15061519

15071520
def create_default_index_implicit(

xarray/core/indexing.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,16 @@ def expanded_indexer(key, ndim):
240240
return tuple(new_key)
241241

242242

243-
def _normalize_slice(sl: slice, size: int) -> slice:
243+
def normalize_slice(sl: slice, size: int) -> slice:
244244
"""
245245
Ensure that given slice only contains positive start and stop values
246246
(stop can be -1 for full-size slices with negative steps, e.g. [-10::-1])
247247
248248
Examples
249249
--------
250-
>>> _normalize_slice(slice(0, 9), 10)
250+
>>> normalize_slice(slice(0, 9), 10)
251251
slice(0, 9, 1)
252-
>>> _normalize_slice(slice(0, -1), 10)
252+
>>> normalize_slice(slice(0, -1), 10)
253253
slice(0, 9, 1)
254254
"""
255255
return slice(*sl.indices(size))
@@ -266,7 +266,7 @@ def _expand_slice(slice_: slice, size: int) -> np.ndarray[Any, np.dtype[np.integ
266266
>>> _expand_slice(slice(0, -1), 10)
267267
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
268268
"""
269-
sl = _normalize_slice(slice_, size)
269+
sl = normalize_slice(slice_, size)
270270
return np.arange(sl.start, sl.stop, sl.step)
271271

272272

@@ -275,14 +275,14 @@ def slice_slice(old_slice: slice, applied_slice: slice, size: int) -> slice:
275275
index it with another slice to return a new slice equivalent to applying
276276
the slices sequentially
277277
"""
278-
old_slice = _normalize_slice(old_slice, size)
278+
old_slice = normalize_slice(old_slice, size)
279279

280280
size_after_old_slice = len(range(old_slice.start, old_slice.stop, old_slice.step))
281281
if size_after_old_slice == 0:
282282
# nothing left after applying first slice
283283
return slice(0)
284284

285-
applied_slice = _normalize_slice(applied_slice, size_after_old_slice)
285+
applied_slice = normalize_slice(applied_slice, size_after_old_slice)
286286

287287
start = old_slice.start + applied_slice.start * old_slice.step
288288
if start < 0:

xarray/indexes/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
PandasIndex,
99
PandasMultiIndex,
1010
)
11+
from xarray.indexes.range_index import RangeIndex
1112

12-
__all__ = ["Index", "PandasIndex", "PandasMultiIndex"]
13+
__all__ = ["Index", "PandasIndex", "PandasMultiIndex", "RangeIndex"]

0 commit comments

Comments
 (0)