2015-10-19 3 views
3

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

Вот что я пытался до сих пор, и в этом случае п = 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() 

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

ответ

6

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

+1

Это будет довольно медленно, так как он не векторизации кода. Я пробовал с «n = 10000», и этот подход более чем в 140 раз медленнее, чем векторный подход. – TheBlackCat

+0

Да, я действительно поддержал ваш ответ и уточнил, что у меня были сомнения относительно скорости в моей. Тем не менее, у ОП не было явных требований относительно скорости, поэтому я не думаю, что должен удалить свой ответ; но я думаю, что ваш должен быть тем, который был отмечен как принятый. –

3

Вы можете сделать (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 

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

+0

Сделал бы это так, хорошо, хорошо! – Divakar

Смежные вопросы