python:检查numpy数组是否包含另一个数组的任何元素

Ale*_*lex 11 python numpy

检查numpy数组是否包含另一个数组的任何元素的最佳方法是什么?

例:

array1 = [10,5,4,13,10,1,1,22,7,3,15,9]
array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]`
Run Code Online (Sandbox Code Playgroud)

我想得到一个Trueif array1包含任何值array2,否则a False.

Ale*_*der 18

使用Pandas,您可以使用isin:

a1 = np.array([10,5,4,13,10,1,1,22,7,3,15,9])
a2 = np.array([3,4,9,10,13,15,16,18,19,20,21,22,23])

>>> pd.Series(a1).isin(a2).any()
True
Run Code Online (Sandbox Code Playgroud)

并使用in1d numpy函数(根据@Norman的评论):

>>> np.any(np.in1d(a1, a2))
True
Run Code Online (Sandbox Code Playgroud)

对于小例如本例中的数组,使用set的解决方案显然是赢家.对于较大的,不相似的阵列(即没有重叠),Pandas和Numpy解决方案更快.但是,np.intersect1d对于更大的阵列来说似乎更胜一筹.

小阵列(12-13个元素)

%timeit set(array1) & set(array2)
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 1.69 µs per loop

%timeit any(i in a1 for i in a2)
The slowest run took 12.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 1.88 µs per loop

%timeit np.intersect1d(a1, a2)
The slowest run took 10.29 times longer than the fastest. This could mean that an intermediate result is being cached 
100000 loops, best of 3: 15.6 µs per loop

%timeit np.any(np.in1d(a1, a2))
10000 loops, best of 3: 27.1 µs per loop

%timeit pd.Series(a1).isin(a2).any()
10000 loops, best of 3: 135 µs per loop
Run Code Online (Sandbox Code Playgroud)

使用具有100k元素的数组(无重叠):

a3 = np.random.randint(0, 100000, 100000)
a4 = a3 + 100000

%timeit np.intersect1d(a3, a4)
100 loops, best of 3: 13.8 ms per loop    

%timeit pd.Series(a3).isin(a4).any()
100 loops, best of 3: 18.3 ms per loop

%timeit np.any(np.in1d(a3, a4))
100 loops, best of 3: 18.4 ms per loop

%timeit set(a3) & set(a4)
10 loops, best of 3: 23.6 ms per loop

%timeit any(i in a3 for i in a4)
1 loops, best of 3: 34.5 s per loop
Run Code Online (Sandbox Code Playgroud)


Nil*_*esh 8

你可以试试这个

>>> array1 = [10,5,4,13,10,1,1,22,7,3,15,9]
>>> array2 = [3,4,9,10,13,15,16,18,19,20,21,22,23]
>>> set(array1) & set(array2)
set([3, 4, 9, 10, 13, 15, 22])
Run Code Online (Sandbox Code Playgroud)

如果得到结果意味着两个数组中都有共同的元素.

如果结果为空则表示没有共同的元素.