Что такое эквивалент оператора in для 2D-массива Numpy?

Использование списков 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?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
55
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

В случае массива 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() другими функциями.

  • Для подсчета вхождений используйте sum().
  • Чтобы найти первый индекс, используйте argmax(). Имейте в виду, что argmax() возвращает 0, если вхождение не обнаружено.

Согласно этому ответу, это будет лучший вариант:

a = np.array([[0, 1], [3, 4]])
b = np.array([0, 2])

any(np.equal(a, b).all(1))

Другие вопросы по теме