From 2e1c06bc36ceb881f349ed3758e88b9d9cd405ba Mon Sep 17 00:00:00 2001 From: Mayeul d'Avezac <2745737+mdavezac@users.noreply.github.com> Date: Wed, 10 Apr 2019 10:57:52 +0100 Subject: [PATCH 1/4] Indexing with an empty array Closes #2882 --- xarray/core/dataset.py | 4 +++- xarray/tests/test_dataarray.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index cf6631fa5ba..769e976a527 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -8,7 +8,7 @@ from distutils.version import LooseVersion from numbers import Number from typing import ( - Any, Callable, Dict, List, Optional, Set, Tuple, TypeVar, Union) + Any, Callable, Dict, List, Optional, Set, Tuple, TypeVar, Union, Sequence) import numpy as np import pandas as pd @@ -1516,6 +1516,8 @@ def _validate_indexers( v = as_variable(v) elif isinstance(v, Dataset): raise TypeError('cannot use a Dataset as an indexer') + elif isinstance(v, Sequence) and len(v) == 0: + v = IndexVariable((k, ), np.asarray(v, dtype='int64')) else: v = np.asarray(v) diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index b1ecf160533..99a1dfdddae 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -501,6 +501,18 @@ def test_getitem_dataarray(self): assert_equal(da[ind], da[[0, 1]]) assert_equal(da[ind], da[ind.values]) + def test_getitem_empty_index(self): + da = DataArray(np.arange(12).reshape((3, 4)), dims=['x', 'y']) + assert da[{'x': []}].size == 0 + assert da[{'x': []}].x.size == 0 + assert da[{'x': []}].y.size == da.y.size + + assert da.loc[{'x': []}].size == 0 + assert da.loc[{'x': []}].x.size == 0 + assert da.loc[{'x': []}].y.size == da.y.size + + assert da[[]].shape == da.values[[]].shape + def test_setitem(self): # basic indexing should work as numpy's indexing tuples = [(0, 0), (0, slice(None, None)), From abc4b38d4ea77dc1d6f6b24546d8b714579da9c5 Mon Sep 17 00:00:00 2001 From: Mayeul d'Avezac <2745737+mdavezac@users.noreply.github.com> Date: Wed, 10 Apr 2019 11:15:30 +0100 Subject: [PATCH 2/4] Adds 2882 resolution to whats-new.rst --- doc/whats-new.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/whats-new.rst b/doc/whats-new.rst index 4c126196469..f67cf2a7c02 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -24,6 +24,9 @@ Enhancements Bug fixes ~~~~~~~~~ +- indexing with an empty list creates an object with zero-length axis (:issue:`2882`) + By `Mayeul d'Avezac `_. + .. _whats-new.0.12.1: v0.12.1 (4 April 2019) From 5412729988431d92ef5b0847e64198ccfe3dc412 Mon Sep 17 00:00:00 2001 From: Mayeul d'Avezac <2745737+mdavezac@users.noreply.github.com> Date: Thu, 11 Apr 2019 09:12:53 +0100 Subject: [PATCH 3/4] Create empty indexing array directly --- xarray/core/dataset.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 769e976a527..1a866bf7781 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -1517,7 +1517,7 @@ def _validate_indexers( elif isinstance(v, Dataset): raise TypeError('cannot use a Dataset as an indexer') elif isinstance(v, Sequence) and len(v) == 0: - v = IndexVariable((k, ), np.asarray(v, dtype='int64')) + v = IndexVariable((k, ), np.zeros((0,), dtype='int64')) else: v = np.asarray(v) From cf0052f9863a597cddc6b34ff8d8b983774c8618 Mon Sep 17 00:00:00 2001 From: Mayeul d'Avezac <2745737+mdavezac@users.noreply.github.com> Date: Thu, 11 Apr 2019 09:17:12 +0100 Subject: [PATCH 4/4] assert xxx -> asset_identical --- xarray/tests/test_dataarray.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index 99a1dfdddae..58eb6a1d6dc 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -503,15 +503,11 @@ def test_getitem_dataarray(self): def test_getitem_empty_index(self): da = DataArray(np.arange(12).reshape((3, 4)), dims=['x', 'y']) - assert da[{'x': []}].size == 0 - assert da[{'x': []}].x.size == 0 - assert da[{'x': []}].y.size == da.y.size - - assert da.loc[{'x': []}].size == 0 - assert da.loc[{'x': []}].x.size == 0 - assert da.loc[{'x': []}].y.size == da.y.size - - assert da[[]].shape == da.values[[]].shape + assert_identical(da[{'x': []}], + DataArray(np.zeros((0, 4)), dims=['x', 'y'])) + assert_identical(da.loc[{'y': []}], + DataArray(np.zeros((3, 0)), dims=['x', 'y'])) + assert_identical(da[[]], DataArray(np.zeros((0, 4)), dims=['x', 'y'])) def test_setitem(self): # basic indexing should work as numpy's indexing