2016-03-23 4 views
9

Was ist der beste Weg um zu überprüfen, ob ein numpy Array ein Element eines anderen Arrays enthält?Python: Überprüfen, ob ein numpy Array ein Element eines anderen Arrays enthält

Beispiel:

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

Ich möchte bekommen True wenn array1 einen beliebigen Wert von array2 enthält, andernfalls wird ein False.

+2

Sie können 'set' verwenden – Nilesh

+2

Verwenden Sie' np.any (np.in1d ​​(array2, array1)) '. – Norman

Antwort

14

Mit Pandas, können Sie isin verwenden:

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 

Und mit der in1d numpy Funktion (pro dem Kommentar von @Norman):

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

Für kleine Arrays, wie sie in diesem Beispiel , ist die Lösung, die Satz verwendet, der klare Sieger. Für größere, ungleiche Arrays (d. H. Keine Überlappung) sind die Lösungen von Pandas und Numpy schneller. np.intersect1d scheint sich jedoch für größere Arrays zu eignen.

kleine Arrays (12-13 Elemente)

%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 

ein Array mit 100K Elementen (keine Überlappung):

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

Ich hatte die Arrays in meinem Kommentar getauscht. Ich habe es korrigiert. – Norman

+0

@Norman Ist die Bestellung wichtig? Wenn wir testen, ob sie einen einzigen Wert teilen, würde ich das nicht glauben. – Alexander

+0

Oh yeah, richtig, es ist spät :-) Man könnte das kürzere Array aus Performance-Gründen jedoch zuerst setzen. – Norman

6

können Sie diese versuchen

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

Wenn Sie Ergebnis bedeutet, gibt es gemeinsame Elemente in beiden Array erhalten.

Wenn das Ergebnis leer ist, bedeutet keine gemeinsamen Elemente.

1

Sie any eingebaute Funktion verwenden können und Listenverständnis:

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