summaryrefslogtreecommitdiff
path: root/numpy/lib/tests/test_arraysetops.py
diff options
context:
space:
mode:
authorMiles Cranmer <miles.cranmer@gmail.com>2022-06-29 17:49:50 -0400
committerGitHub <noreply@github.com>2022-06-29 14:49:50 -0700
commitf9bed20bffd88bce06dbc8be200179edfe7580a4 (patch)
tree811c7302e39860f5731f315882f09631ff9b550e /numpy/lib/tests/test_arraysetops.py
parent10f0e0ad0f8b5bbc58cbc45623cc7f4f80eaba3b (diff)
downloadnumpy-f9bed20bffd88bce06dbc8be200179edfe7580a4.tar.gz
BUG: Fix numpy.isin for timedelta dtype (#21860)
This PR fixes the issue discussed on #12065 and #21843 where 'timedelta64' was noted to be a subtype of numpy.integer. This in principle should detect any cases where int(np.min(ar2)) fails. This PR also adds unittests for these. * TST: Create in1d test for timedelta input * MAINT: fix in1d for timedelta input * TST: in1d raise ValueError for timedelta input * MAINT: Clean up type checking for isin kind="table" * TST: Add test for mixed boolean/integer in1d * MAINT: Increase readability of in1d type checking * STY: Apply small code style tweaks This is probably really mainly my personal opinion... Co-authored-by: Sebastian Berg <sebastian@sipsolutions.net>
Diffstat (limited to 'numpy/lib/tests/test_arraysetops.py')
-rw-r--r--numpy/lib/tests/test_arraysetops.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/numpy/lib/tests/test_arraysetops.py b/numpy/lib/tests/test_arraysetops.py
index a21e5f640..bb07e25a9 100644
--- a/numpy/lib/tests/test_arraysetops.py
+++ b/numpy/lib/tests/test_arraysetops.py
@@ -396,6 +396,37 @@ class TestSetOps:
assert_array_equal(np.invert(expected),
in1d(a, b, invert=True, kind=kind))
+ @pytest.mark.parametrize("kind", [None, "sort"])
+ def test_in1d_timedelta(self, kind):
+ """Test that in1d works for timedelta input"""
+ rstate = np.random.RandomState(0)
+ a = rstate.randint(0, 100, size=10)
+ b = rstate.randint(0, 100, size=10)
+ truth = in1d(a, b)
+ a_timedelta = a.astype("timedelta64[s]")
+ b_timedelta = b.astype("timedelta64[s]")
+ assert_array_equal(truth, in1d(a_timedelta, b_timedelta, kind=kind))
+
+ def test_in1d_table_timedelta_fails(self):
+ a = np.array([0, 1, 2], dtype="timedelta64[s]")
+ b = a
+ # Make sure it raises a value error:
+ with pytest.raises(ValueError):
+ in1d(a, b, kind="table")
+
+ @pytest.mark.parametrize("kind", [None, "sort", "table"])
+ def test_in1d_mixed_boolean(self, kind):
+ """Test that in1d works as expected for bool/int input."""
+ for dtype in np.typecodes["AllInteger"]:
+ a = np.array([True, False, False], dtype=bool)
+ b = np.array([1, 1, 1, 1], dtype=dtype)
+ expected = np.array([True, False, False], dtype=bool)
+ assert_array_equal(in1d(a, b, kind=kind), expected)
+
+ a, b = b, a
+ expected = np.array([True, True, True, True], dtype=bool)
+ assert_array_equal(in1d(a, b, kind=kind), expected)
+
def test_in1d_first_array_is_object(self):
ar1 = [None]
ar2 = np.array([1]*10)