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

时间:2016-03-23 23:19:59

标签: 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]`

如果True包含array1的任何值,我希望获得array2,否则为False

3 个答案:

答案 0 :(得分:16)

使用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

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

>>> np.any(np.in1d(a1, a2))
True

对于小例如本例中的数组,使用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

使用包含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

答案 1 :(得分:6)

你可以试试这个

>>> 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])

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

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

答案 2 :(得分:1)

您可以使用any内置函数和列表理解:

>>> 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]
>>> any(i in array2 for i in array1)
True
相关问题