Reputation: 878
I have two 1D arrays and I want to find out if an element in one array occurs in another array or not.
For example:
import numpy as np
A = np.array([ 1, 48, 50, 78, 85, 97])
B = np.array([38, 43, 50, 62, 78, 85])
I want:
C = [2,3,4] # since 50 in second array occurs in first array at index 2,
# similarly 78 in second array occurs in first array in index 3,
# similarly for 85, it is index 4
I tried:
accuracy = np.searchsorted(A, B)
But it gives me undesirable results.
Upvotes: 9
Views: 8437
Reputation: 8106
Since version 2.0 of numpy function in1d
is deprecated. Recommendation is to use isin
instead:
np.where(np.isin(A, B))[0]
(array([2, 3, 4]),)
Upvotes: 0
Reputation: 177078
You could use np.where
and np.in1d
:
>>> np.where(np.in1d(A, B))[0]
array([2, 3, 4])
np.in1d(A, B)
returns a boolean array indicating whether each value of A
is found in B
. np.where
returns the indices of the True
values. (This will also work if your arrays are not sorted.)
Upvotes: 15
Reputation: 17847
You should start with np.intersect1d
, which finds the set intersection (common elements) between arrays.
In [5]: np.intersect1d(A, B)
Out[5]: array([50, 78, 85])
To get the desired output from your question, you can then use np.searchsorted
with just those items:
In [7]: np.searchsorted(A, np.intersect1d(A, B))
Out[7]: array([2, 3, 4])
Upvotes: 7