From 019c8c9b2a7c084eb01cf4d8569799a5537d884d Mon Sep 17 00:00:00 2001 From: Miles Cranmer Date: Fri, 24 Jun 2022 08:24:22 -0400 Subject: BUG: Fix in1d for empty integer array as input (#21842) * TST: Tests empty input to in1d of various types * MAINT: Skip table method on empty input array * MAINT: Check array size before call to min * MAINT: Return early for kind="table" and empty ar2 * TST: Test other dtypes of empty arrays --- numpy/lib/arraysetops.py | 7 +++++++ numpy/lib/tests/test_arraysetops.py | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'numpy/lib') diff --git a/numpy/lib/arraysetops.py b/numpy/lib/arraysetops.py index 9a44d7e44..fa332e7fd 100644 --- a/numpy/lib/arraysetops.py +++ b/numpy/lib/arraysetops.py @@ -636,6 +636,13 @@ def in1d(ar1, ar2, assume_unique=False, invert=False, *, kind=None): f"Invalid kind: '{kind}'. Please use None, 'sort' or 'table'.") if integer_arrays and kind in {None, 'table'}: + + if ar2.size == 0: + if invert: + return np.ones_like(ar1, dtype=bool) + else: + return np.zeros_like(ar1, dtype=bool) + ar2_min = np.min(ar2) ar2_max = np.max(ar2) diff --git a/numpy/lib/tests/test_arraysetops.py b/numpy/lib/tests/test_arraysetops.py index d91d36282..a21e5f640 100644 --- a/numpy/lib/tests/test_arraysetops.py +++ b/numpy/lib/tests/test_arraysetops.py @@ -232,12 +232,30 @@ class TestSetOps: assert_isin_equal(5, 6) # empty array-like: - if kind in {None, "sort"}: + if kind != "table": + # An empty list will become float64, + # which is invalid for kind="table" x = [] assert_isin_equal(x, b) assert_isin_equal(a, x) assert_isin_equal(x, x) + # empty array with various types: + for dtype in [bool, np.int64, np.float64]: + if kind == "table" and dtype == np.float64: + continue + + if dtype in {np.int64, np.float64}: + ar = np.array([10, 20, 30], dtype=dtype) + elif dtype in {bool}: + ar = np.array([True, False, False]) + + empty_array = np.array([], dtype=dtype) + + assert_isin_equal(empty_array, ar) + assert_isin_equal(ar, empty_array) + assert_isin_equal(empty_array, empty_array) + @pytest.mark.parametrize("kind", [None, "sort", "table"]) def test_in1d(self, kind): # we use two different sizes for the b array here to test the -- cgit v1.2.1