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