2012-05-12 10 views
9

Zum Beispiel: Ich habe a = np.array([123, 412, 444]) und b = np.array([123, 321])Numpy: Wie überprüft man, ob das Array bestimmte Nummern enthält?

Ich möchte wissen, ob aalle in b die Elemente enthält. Gibt es dafür eine einfache Operation? In diesem Fall wäre das nicht wahr.

+0

Meinst du einzigartige Elemente? a = [3,3,4], b = [3,4,5], sind alle Elemente von a in b enthalten? – Akavall

+0

Nein, ich meinte, dass alle Elemente in b in einem sein müssen. Die Antworten unten, wo ich gesucht habe. Danke – luffe

Antwort

10

Sie können den Set-Unterschied verwenden, um zu bestimmen, wonach Sie suchen. Numpy hat eine eingebaute Funktion numpy.setdiff1d(ar1, ar2) genannt:

Return the sorted, unique values in ar1 that are not in ar2.

Beispiel für Ihren Fall:

>>> a = np.array([123, 412, 444]) 
>>> b = np.array([123, 321]) 
>>> diff = np.setdiff1d(b, a) 
>>> print diff 
array([321]) 
>>> if diff.size: 
>>> print "Not passed" 

Also für Ihren Fall würden Sie eine Menge Unterschied machen Sie ein von b abziehen würde und ein Array erhalten mit Elementen in b, die nicht in a sind. Dann können Sie überprüfen, ob das leer war oder nicht. Wie Sie sehen können, ist die Ausgabe 312, was ein Eintrag in a ist, aber nicht in b; die Länge davon ist jetzt größer als Null, daher gab es Elemente in b, die in a nicht vorhanden waren.

+0

Danke an alle – luffe

+0

@luffe wenn ich deine Frage beantwortet habe, bitte markieren Sie es als Antwort. – petr

+0

@petr besser zu überprüfen 'if diff' statt – jamylak

-1

Sie tun können:

a = an_array 
b = another_array 
for i in b: 
    if i not in a: 
     return False 
return True 
+0

Das ist nicht gültig Python. Außerdem ist eine Python-Schleife in einem numpy Array sehr langsam. – rubik

+0

Wie genau ist das ungültige Python? – cobie

+1

Offensichtlich haben Sie es nicht im Interpreter ausgeführt. Wenn Sie dies getan hätten, hätten Sie entdeckt, dass Ihr Code einen 'SyntaxError:' auslöst, der 'outside function' zurückgibt. – rubik

2

, das bedeutet, dass Sie, wenn jedes Element von b überprüfen möchten in ein enthalten ist. in1d das tut:

from numpy import array, in1d 
a = array([123, 412, 444]) 
b = array([123, 321]) 
print in1d(b, a).all() 
12

Sie alle Tage einen Satz verwenden:

>>> a = numpy.array([123, 412, 444]) 
>>> b = numpy.array([123, 321]) 
>>> set(b) in set(a) 
False 

Oder mit neueren Versionen von numpy:

>>> numpy.in1d(b,a) 
array([ True, False], dtype=bool) 

Wenn Sie nur 'die Antwort' statt ein Array:

>>> numpy.in1d(b,a).all() 
False 

Or (am wenigsten wünschenswerte):

>>> numpy.array([x in a for x in b]) 
array([ True, False], dtype=bool) 

Looping ist slowish auf numpy Arrays und sollte vermieden werden.

+0

'set (b) in Satz (a)' wahrscheinlich nicht tun, was Sie wollen, das wäre 'set.is [super | sub] set'. – TryPyPy

+0

Warum sollte (b) in Satz (a) nicht funktionieren? – Arturo

Verwandte Themen