2012-05-12 146 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

相关问题