Использование списков Python:
a = [[0, 1], [3, 4]]
b = [0, 2]
print(b in a)
На выходе я получаю False, но с массивами Numpy:
a = np.array([[0, 1], [3, 4]])
b = np.array([0, 2])
print(b in a)
На выходе я получаю True. Что является эквивалентом оператора in выше для 2D-массивов Numpy?






В случае массива NumPy b в a интерпретируется как проверка наличия какого-либо элемента b в a, а не проверка наличия b как целого массива.
Вы можете использовать функцию numpy.all вместе с numpy.any для сравнения строк:
a = np.array([[0, 1], [3, 4]])
b = np.array([0, 2])
is_row_present = np.any(np.all(a == b, axis=1))
print(is_row_present)
>>> False
В общем, если у вас есть стог сена N-dim и игла (N-1)-тусклости и вы хотите найти все места, где встречается игла в стоге сена, вы можете сравнить с == трансляцией иглы, а затем уменьшить с помощью all на все размеры, кроме первого:
(haystack == needle).all(axis=tuple(range(1, haystack.ndim)))
Если вы хотите узнать, есть ли совпадения, просто добавьте .any() к приведенному выше выражению.
Вы можете сделать это следующим образом:
import numpy as np
a = np.array([[0, 1], [3, 4]])
b = np.array([0, 2])
result = any((b == x).all() for x in a)
print(result) # Output : False
Этот код должен быть решением, которое работает аналогично in для списков Python:
(a == b).all(1).any()
Альтернативно вы можете заменить (a == b) на numpy.isin(a, b).
Первая часть, (a == b), возвращает этот массив:
>>> a = numpy.array([[0, 1], [3, 4]])
>>> b = numpy.array([0, 2])
>>> a == b
array([[ True, False],
[False, False]])
Здесь True обозначает соответствие 0.
Когда b является частью a, результат может выглядеть следующим образом:
>>> a = numpy.array([[0, 1], [3, 4]])
>>> b = numpy.array([3, 4])
>>> a == b
array([[False, False],
[ True, True]])
Таким образом, все логические значения в одной строке должны быть True.
Чтобы проверить это, мы вызываем all(axis=1). Это возвращает логическое значение для каждого столбца.
>>> a = numpy.array([[0, 1], [3, 4]])
>>> b = numpy.array([0, 2])
>>> (a == b).all(1)
array([False, False])
>>> b = numpy.array([3, 4])
>>> (a == b).all(1)
array([False, True])
И, наконец, мы вызываем Any(), чтобы проверить, есть ли какие-либо вхождения.
Обратите внимание, что вы также можете подсчитать вхождения или найти первый индекс, заменив any() другими функциями.
Согласно этому ответу, это будет лучший вариант:
a = np.array([[0, 1], [3, 4]])
b = np.array([0, 2])
any(np.equal(a, b).all(1))