#python #arrays #numpy
Вопрос:
У меня есть два массива:
X = np.array([[3, 4, 1], [2, 3, 4], [3, 5, 1]])
v = np.array([1, 5, 3])
Я хочу проверить, находится ли v в X по элементам, т. Е. 1 находится в [3, 4, 1], 5 находится в [2, 3, 4], а 3 находится в [3, 5, 1] и возвращает 1 и 0. Таким образом, в этом случае мой ответ должен быть [1,0,1].
Спасибо
Комментарии:
1. Вы могли бы проверить равенство и позвонить
any
, например(v[:,None] == X).any(1)
.
Ответ №1:
Я недостаточно разбираюсь в NumPy, чтобы использовать array
объекты, но я создал функцию, которая будет работать с обычными списками:
def check_correspondence(lists, numbers):
for i in range(len(lists)):
yield int(numbers[i] in lists[i])
Всякий раз , когда вы звоните check_correspondence
, вам нужно преобразовать его в список или кортеж, так как он является генератором. В любом случае, его можно изменить, чтобы принять numpy.array
.
Ответ №2:
Создайте новую ось для v:
>>> np.any(X - v[:, np.newaxis] == 0, axis=1) * 1
array([1, 0, 1])
numpy.newaxis: Объект newaxis может использоваться во всех операциях среза для создания оси длины. newaxis-это псевдоним для «None», и «None» можно использовать вместо этого с тем же результатом.
Производительность
X = np.random.randint(100, 1000, (100000, 1000))
v = np.random.randint(100, 1000, 100000)
%timeit np.any(X - v[:, np.newaxis] == 0, axis=1) * 1
880 ms ± 110 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Комментарии:
1. Спасибо, это работает. Просто интересно, есть ли более эффективный способ сделать это?
2. Более эффективно. ИМХО, я думаю, что это действительно невозможно. Не забудьте принять ответ, если это соответствует вашим потребностям, пожалуйста.