Numpy имеет функцию set numpy.setmember1d (), которая работает с отсортированными и уникальными массивами и возвращает именно тот логический массив, который вам нужен. Если входные массивы не соответствуют критериям, вам необходимо преобразовать их в заданный формат и инвертировать преобразование результата.
import numpy as np
a = np.array([6,1,2,3,4,5,6])
b = np.array([1,4,5])
# convert to the uniqued form
a_set, a_inv = np.unique1d(a, return_inverse=True)
b_set = np.unique1d(b)
# calculate matching elements
matches = np.setmea_set, b_set)
# invert the transformation
result = matches[a_inv]
print(result)
# [False True False False True True False]
Edit:
К сожалению, метод setmember1d в numpy действительно неэффективен. Предложенный вами метод сортировки и назначения поиска работает быстрее, но если вы можете назначить напрямую, вы также можете назначить непосредственно результат и избежать большого количества ненужного копирования. Также ваш метод потерпит неудачу, если b содержит что-либо не в a. Следующее исправляет эти ошибки:
result = np.zeros(a.shape, dtype=np.bool)
idxs = a.searchsorted(b)
idxs = idxs[np.where(idxs < a.shape[0])] # Filter out out of range values
idxs = idxs[np.where(a[idxs] == b)] # Filter out where there isn't an actual match
result[idxs] = True
print(result)
Мои тесты показывают, что это 91us против 6,6 мс для вашего подхода и 109 мс для NumPy Setmember1d для 1M элемента a и 100 элемента b.