From 25c579ae48c88c16bbe54607ae536f2852c72d23 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Mon, 19 Jun 2023 22:07:38 +0200 Subject: [PATCH] BUG: IntervalIndex.get_indexer raising for read only array (#53703) --- doc/source/whatsnew/v2.1.0.rst | 2 +- pandas/_libs/intervaltree.pxi.in | 4 ++-- pandas/tests/indexes/interval/test_indexing.py | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/doc/source/whatsnew/v2.1.0.rst b/doc/source/whatsnew/v2.1.0.rst index 3c4ca23797f2c..64df847aa74f0 100644 --- a/doc/source/whatsnew/v2.1.0.rst +++ b/doc/source/whatsnew/v2.1.0.rst @@ -401,7 +401,7 @@ Strings Interval ^^^^^^^^ -- +- :meth:`pd.IntervalIndex.get_indexer` and :meth:`pd.IntervalIndex.get_indexer_nonunique` raising if ``target`` is read-only array (:issue:`53703`) - Indexing diff --git a/pandas/_libs/intervaltree.pxi.in b/pandas/_libs/intervaltree.pxi.in index 67fee7c5fbadd..0b99aebbd3816 100644 --- a/pandas/_libs/intervaltree.pxi.in +++ b/pandas/_libs/intervaltree.pxi.in @@ -125,7 +125,7 @@ cdef class IntervalTree(IntervalMixin): sort_order = self.left_sorter return is_monotonic(sort_order, False)[0] - def get_indexer(self, scalar_t[:] target) -> np.ndarray: + def get_indexer(self, ndarray[scalar_t, ndim=1] target) -> np.ndarray: """Return the positions corresponding to unique intervals that overlap with the given array of scalar targets. """ @@ -153,7 +153,7 @@ cdef class IntervalTree(IntervalMixin): old_len = result.data.n return result.to_array().astype('intp') - def get_indexer_non_unique(self, scalar_t[:] target): + def get_indexer_non_unique(self, ndarray[scalar_t, ndim=1] target): """Return the positions corresponding to intervals that overlap with the given array of scalar targets. Non-unique positions are repeated. """ diff --git a/pandas/tests/indexes/interval/test_indexing.py b/pandas/tests/indexes/interval/test_indexing.py index e7db8076efa2b..e65ae52e348c6 100644 --- a/pandas/tests/indexes/interval/test_indexing.py +++ b/pandas/tests/indexes/interval/test_indexing.py @@ -424,6 +424,17 @@ def test_get_indexer_interval_index(self, box): expected = np.array([-1, -1, -1], dtype=np.intp) tm.assert_numpy_array_equal(actual, expected) + def test_get_indexer_read_only(self): + idx = interval_range(start=0, end=5) + arr = np.array([1, 2]) + arr.flags.writeable = False + result = idx.get_indexer(arr) + expected = np.array([0, 1]) + tm.assert_numpy_array_equal(result, expected, check_dtype=False) + + result = idx.get_indexer_non_unique(arr)[0] + tm.assert_numpy_array_equal(result, expected, check_dtype=False) + class TestSliceLocs: def test_slice_locs_with_interval(self):