Проверка того, содержит ли массив NumPy другой массив

89
7

Используя NumPy с Python 2.7, я хочу создать массив n-by-2 y. Затем я хочу проверить, содержит ли этот массив конкретный массив 1 на 2 z в любой из его строк.


Вот что я пробовал до сих пор, и в этом случае n = 1:


x = np.array([1, 2]) # Create a 1-by-2 array
y = [x] # Create an n-by-2 array (n = 1), and assign the first row to x
z = np.array([1, 2]) # Create another 1-by-2 array
if z in y: # Check if y contains the row z
print 'yes it is'

Однако это дает мне следующую ошибку:


ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Что я делаю неправильно?

спросил(а) 2021-01-19T16:09:36+03:00 6 месяцев, 2 недели назад
1
Решение
120

Вы можете просто использовать any((z == x).all() for x in y). Я не знаю, если это самый быстрый.

ответил(а) 2021-01-19T16:09:36+03:00 6 месяцев, 2 недели назад
91

Вы можете сделать (y == z).all(1).any().


Чтобы перейти к более подробному описанию, numpy будет автоматически сравнивать элементы по элементам по более высоким измерениям с помощью так называемого "вещания". Поэтому, если y - ваш массив n-by-2, а z - ваш массив 1 на 2, y == z будет сравнивать каждую строку y с z по-элементу. Затем вы можете просто использовать all(axis=1), чтобы получить строки, в которых находятся все элементы, и any(), чтобы узнать, если они совпадают.


Итак, это на практике:

>>> y1 = np.array([[1, 2], [1, 3], [1, 2], [2, 2]])
>>> y2 = np.array([[100, 200], [100,300], [100, 200], [200, 200]])
>>> z = np.array([1, 2])
>>>
>>> (y1 == z).all(1).any()
True
>>> (y2 == z).all(1).any()
False

Это значительно быстрее, чем выполнение петлевого или генераторного подхода, поскольку он векторизовывает операцию.

ответил(а) 2021-01-19T16:09:36+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема