Numpy: Как проверить, содержит ли массив определенные числа?

например: у меня a = np.array([123, 412, 444]) и b = np.array([123, 321])

Я хочу знать, если a содержит все элементов b. Есть ли простая операция для этого? В данном случае это не так.

4 ответов


вы можете использовать set difference, чтобы определить, что вы ищете. Numpy имеет встроенную функцию и NumPy.setdiff1d(ar1, ar2):

верните отсортированные уникальные значения в ar1, которые не находятся в 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.


вы всегда можете использовать набор:

>>> 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 и его следует избегать.


это означает, что вы хотите проверить, содержится ли каждый элемент b в a. in1d это:

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

вы могли бы сделать:

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