2012-05-12 145 views
9

例如:我有a = np.array([123, 412, 444])b = np.array([123, 321])Numpy:如何檢查數組是否包含某些數字?

我想知道,如果a包含b所有的元素。這是否有一個簡單的操作?在這種情況下,這不會是真的。

+0

你的意思是獨特的元素? a = [3,3,4],b = [3,4,5],都包含在b中的元素? – Akavall

+0

不,我的意思是b中的所有元素都必須在a中。下面的答案在哪裏,我正在尋找。謝謝 – luffe

回答

10

您可以使用設置差異來確定您要查找的內容。 NumPy的有一個內置的函數調用numpy.setdiff1d(ar1, ar2)

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

例如,對於你的情況:

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

所以對於你的情況,你會做設定的差,你會從B減去並獲得一個數組元素在b中不在a中。然後你可以檢查是否是空的。如您所見,輸出爲312,這是a中的一個條目,但不在b中;它的長度現在大於零,因此b中的元素不存在於a中。

+0

謝謝大家 – luffe

+0

@luffe如果我回答了您的問題,請將其標記爲答案。 – petr

+0

@petr更好地檢查'if diff'而不是 – jamylak

-1

你可以這樣做:

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

這是無效的Python。另外,numpy數組上的Python循環非常慢。 – rubik

+0

這個無效的python究竟如何? – cobie

+1

顯然你沒有在解釋器中運行它。如果你這樣做了,你會發現你的代碼引發了一個'SyntaxError:'return'外部函數'。 – rubik

2

這意味着你要檢查,如果B的每個元素都包含在。 in1d做的是:

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

你可以送花兒給人使用一組:

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

或用numpy的較新版本:

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

如果你只想要的 '答案',而不是陣列:

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

或(最不理想的):

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

循環是numpy的陣列slowish,應該避免。

+0

'set(b)in set(a)'可能不會做你想做的事,那就是'set.is [super | sub] set'。 – TryPyPy

+0

爲什麼在集合(a)中設置(b)不起作用? – Arturo

相關問題