numpy.isin#

numpy.isin(элемент, test_elements, assume_unique=False, инвертировать=False, *, kind=None)[источник]#

Вычисляет element in test_elements, трансляция по элемент только. Возвращает логический массив той же формы, что и элемент которое равно True где элемент элемент находится в test_elements и False в противном случае.

Параметры:
элементarray_like

Входной массив.

test_elementsarray_like

Значения, с которыми сравнивается каждое значение элемент. Этот аргумент сглаживается, если это массив или подобный массиву. См. примечания о поведении с параметрами, не являющимися массивами.

assume_uniquebool, необязательно

Если True, предполагается, что входные массивы уникальны, что может ускорить вычисление. По умолчанию False.

инвертироватьbool, необязательно

Если True, значения в возвращаемом массиве инвертируются, как если бы вычислялось элемент не в test_elements. По умолчанию False. np.isin(a, b, invert=True) эквивалентно (но быстрее чем) np.invert(np.isin(a, b)).

kind{None, ‘sort’, ‘table’}, опционально

Алгоритм для использования. Это не повлияет на конечный результат, но повлияет на скорость и использование памяти. Значение по умолчанию, None, выберет автоматически на основе соображений памяти.

  • Если 'sort', будет использован подход на основе сортировки слиянием. Это потребует памяти примерно в 6 раз больше суммы размеров элемент и test_elements, не учитывая размер типов данных.

  • Если ‘table’, будет использован подход с таблицей поиска, аналогичный сортировке подсчетом. Это доступно только для булевых и целочисленных массивов. Это потребует памяти размером элемент плюс максимально-минимальное значение test_elements. assume_unique не имеет эффекта при использовании опции 'table'.

  • Если None, автоматически выберет 'table', если требуемое выделение памяти меньше или равно 6-кратной сумме размеров элемент и test_elements, иначе будет использоваться 'sort'. Это сделано, чтобы не использовать большое количество памяти по умолчанию, даже если 'table' может быть быстрее в большинстве случаев. Если выбран 'table', assume_unique не окажет никакого эффекта.

Возвращает:
isinndarray, bool

Имеет ту же форму, что и элементЗначения элемент[isin] находятся в test_elements.

Примечания

isin является поэлементной версией ключевого слова Python в. isin(a, b) примерно эквивалентно np.array([item in b for item in a]) if a и b являются одномерными последовательностями.

элемент и test_elements преобразуются в массивы, если они ещё не являются таковыми. Если test_elements является множеством (или другой неупорядоченной коллекцией), он будет преобразован в объектный массив с одним элементом, а не в массив значений, содержащихся в test_elements. Это следствие array способ обработки конструктором коллекций, не являющихся последовательностями. Преобразование множества в список обычно дает желаемое поведение.

Используя kind='table' обычно быстрее, чем kind='sort' если следующее соотношение верно: log10(len(test_elements)) > (log10(max(test_elements)-min(test_elements)) - 2.27) / 0.927, но может использовать больше памяти. Значение по умолчанию для kind будет автоматически выбран только на основе использования памяти, поэтому можно вручную установить kind='table' если ограничения по памяти могут быть ослаблены.

Примеры

>>> import numpy as np
>>> element = 2*np.arange(4).reshape((2, 2))
>>> element
array([[0, 2],
       [4, 6]])
>>> test_elements = [1, 2, 4, 8]
>>> mask = np.isin(element, test_elements)
>>> mask
array([[False,  True],
       [ True, False]])
>>> element[mask]
array([2, 4])

Индексы совпавших значений можно получить с помощью nonzero:

>>> np.nonzero(mask)
(array([0, 1]), array([1, 0]))

Тест также можно инвертировать:

>>> mask = np.isin(element, test_elements, invert=True)
>>> mask
array([[ True, False],
       [False,  True]])
>>> element[mask]
array([0, 6])

Из-за того, как array обрабатывает множества, следующее не работает как ожидается:

>>> test_set = {1, 2, 4, 8}
>>> np.isin(element, test_set)
array([[False, False],
       [False, False]])

Приведение множества к списку дает ожидаемый результат:

>>> np.isin(element, list(test_set))
array([[False,  True],
       [ True, False]])