Проверьте, находится ли каждый элемент 1-го массива numpy в соответствующей строке 2-го массива numpy

#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. Более эффективно. ИМХО, я думаю, что это действительно невозможно. Не забудьте принять ответ, если это соответствует вашим потребностям, пожалуйста.