python: verifica si una matriz numpy contiene algún elemento de otra matriz

¿Cuál es la mejor manera de verificar si una matriz numpy contiene algún elemento de otra matriz?

ejemplo:

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

Quiero obtener un True si array1 contiene algún valor de array2 , de lo contrario es False .

Usando Pandas, puedes usar 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 

Y utilizando la función numpy in1d (según el comentario de @Norman):

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

Para arreglos pequeños como los de este ejemplo, la solución que usa set es el claro ganador. Para arreglos más grandes y diferentes (es decir, sin superposición), las soluciones Pandas y Numpy son más rápidas. Sin embargo, np.intersect1d parece excel para matrices más grandes.

Arreglos pequeños (12-13 elementos)

 %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 

Usando una matriz con elementos de 100k (sin superposición) :

 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 

Puedes probar esto

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

Si obtiene un resultado significa que hay elementos comunes en ambas matrices.

Si el resultado está vacío significa que no hay elementos comunes.

Puede utilizar any función incorporada y comprensión de lista:

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