From fb7ccc9ed93e243beae67b03336f55528eb63e3b Mon Sep 17 00:00:00 2001 From: dcherian Date: Thu, 16 Mar 2023 15:50:47 -0600 Subject: [PATCH] Better? --- xarray/backends/zarr.py | 4 +--- xarray/core/indexing.py | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/xarray/backends/zarr.py b/xarray/backends/zarr.py index 4ef30e5e668..bc251d05631 100644 --- a/xarray/backends/zarr.py +++ b/xarray/backends/zarr.py @@ -80,10 +80,8 @@ def __getitem__(self, key): ] else: assert isinstance(key, indexing.OuterIndexer) - # Lie about IndexingSupport so that we do - # rewrite negative slices to positive slices return indexing.explicit_indexing_adapter( - key, array.shape, indexing.IndexingSupport.OUTER, self._oindex + key, array.shape, indexing.IndexingSupport.VECTORIZED, self._oindex ) # if self.ndim == 0: diff --git a/xarray/core/indexing.py b/xarray/core/indexing.py index 9009318f012..0ba716fbf7d 100644 --- a/xarray/core/indexing.py +++ b/xarray/core/indexing.py @@ -23,6 +23,7 @@ NDArrayMixin, either_dict_or_kwargs, get_valid_numpy_dtype, + is_scalar, to_0d_array, ) @@ -980,12 +981,25 @@ def _decompose_outer_indexer( [14, 15, 14], [ 8, 9, 8]]) """ - if indexing_support == IndexingSupport.VECTORIZED: - return indexer, BasicIndexer(()) - assert isinstance(indexer, (OuterIndexer, BasicIndexer)) - backend_indexer: list[Any] = [] np_indexer = [] + + assert isinstance(indexer, (OuterIndexer, BasicIndexer)) + + if indexing_support == IndexingSupport.VECTORIZED: + for k, s in zip(indexer.tuple, shape): + if isinstance(k, slice): + # If it is a slice, then we will slice it as-is + # (but make its step positive) in the backend, + bk_slice, np_slice = _decompose_slice(k, s) + backend_indexer.append(bk_slice) + np_indexer.append(np_slice) + else: + backend_indexer.append(k) + if not is_scalar(k): + np_indexer.append(slice(None)) + return type(indexer)(tuple(backend_indexer)), BasicIndexer(tuple(np_indexer)) + # make indexer positive pos_indexer: list[np.ndarray | int | np.number] = [] for k, s in zip(indexer.tuple, shape):