2012-05-12 27 views
9

Na przykład: Mam a = np.array([123, 412, 444]) i b = np.array([123, 321])Numpy: Jak sprawdzić, czy tablica zawiera określone liczby?

Chcę wiedzieć, czy a zawiera wszystkie elementy w b. Czy jest to prosta operacja? W tym przypadku nie byłoby to prawdą.

+0

Masz na myśli wyjątkowe elementy? a = [3,3,4], b = [3,4,5], są wszystkie elementy zawarte w b? – Akavall

+0

Nie Miałem na myśli, że wszystkie elementy w b musi być w. Odpowiedzi poniżej, gdzie to, czego szukałem. Dzięki – luffe

Odpowiedz

10

Możesz użyć ustawionej różnicy, aby określić, czego szukasz. Numpy posiada wbudowaną funkcję o nazwie numpy.setdiff1d(ar1, ar2):

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

Przykład dla przypadku:

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

więc w Twoim przypadku, byś ustaloną różnicę byś odjąć od b i uzyskać tablicę z elementami w b, które nie są w. Wtedy możesz sprawdzić, czy to było puste, czy nie. Jak widać, wyjście to 312, które jest wpisem obecnym w a, ale nie w b; jego długość jest teraz większa niż zero, w związku z czym były elementy w b, które nie były obecne w a.

+0

Dziękuję wszystkim – luffe

+0

@luffe, jeśli odpowiedziałem na twoje pytanie, proszę oznaczyć je jako odpowiedź. – petr

+0

@petr lepiej sprawdzić 'if diff' zamiast – jamylak

-1

można zrobić:

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

To nie jest prawidłowy język Python. Ponadto pętla Pythona w tablicy numpy jest bardzo powolna. – rubik

+0

jak dokładnie jest ten niepoprawny python? – cobie

+1

Oczywiście nie uruchomiłeś go w tłumaczu. Gdybyś to zrobił, odkryłbyś, że twój kod wywołuje funkcję 'SyntaxError: 'return' outside function'. – rubik

2

Oznacza to, że chcą sprawdzić, czy każdy element jest zawarty w B a. in1d robi:

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

Można sprecyzowane użyć zestawu:

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

Albo z nowszymi wersjami numpy:

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

Jeśli chcesz tylko 'odpowiedź' raczej niż tablica:

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

Albo (najmniej pożądane):

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

pętli jest slowish na NumPy tablic i należy ich unikać.

+0

'set (b) w zestawie (a)' prawdopodobnie nie robi, co chcesz, to byłby 'set.is [super | sub] set'. – TryPyPy

+0

Dlaczego ustawić (b) w zestawie (a) nie działa? – Arturo

Powiązane problemy