2016-09-12 3 views
4

Как я могу выполнить операцию «in» в массиве numpy? (Return True, если элемент присутствует в заданном массиве numpy)Оператор «In» для numpy массивов?

Для строк, списков и словарей функциональность понятна для понимания.

Вот что я получил, когда я применил, что на Numpy массива

a 
array([[[2, 3, 0], 
    [1, 0, 1]], 

    [[3, 2, 0], 
    [0, 1, 1]], 

    [[2, 2, 0], 
    [1, 1, 1]], 

    [[1, 3, 0], 
    [2, 0, 1]], 

    [[3, 1, 0], 
    [0, 2, 1]]]) 

b = [[3, 2, 0], 
    [0, 1, 1]] 

b in a 
True 
#Aligned with the expectation 

c = [[300, 200, 0], 
    [0, 100, 100]] 

c in a 
True 
#Not quite what I expected 
+0

Для 1d массивов есть 'np.in1d', но применение его к строкам массива 2d требует некоторых трюков. Посмотрите на этот код, чтобы узнать, что у него есть. – hpaulj

ответ

4

Вы могли бы сравнить входные массивы equality, которые будут выполнять broadcasted сравнения по всем элементам в a в каждом положении в течение последних двух осей против элементов в соответствующих положениях во втором массиве. Это приведет булевой массив матчей, в которых мы проверяем на ALL матчей через последние два осей и, наконец, проверить на ANY матча, как так -

((a==b).all(axis=(1,2))).any() 

Sample бег

1) Входы :

In [68]: a 
Out[68]: 
array([[[2, 3, 0], 
     [1, 0, 1]], 

     [[3, 2, 0], 
     [0, 1, 1]], 

     [[2, 2, 0], 
     [1, 1, 1]], 

     [[1, 3, 0], 
     [2, 0, 1]], 

     [[3, 1, 0], 
     [0, 2, 1]]]) 

In [69]: b 
Out[69]: 
array([[3, 2, 0], 
     [0, 1, 1]]) 

2) транслировался поэлементные сравнения:

In [70]: a==b 
Out[70]: 
array([[[False, False, True], 
     [False, False, True]], 

     [[ True, True, True], 
     [ True, True, True]], 

     [[False, True, True], 
     [False, True, True]], 

     [[False, False, True], 
     [False, False, True]], 

     [[ True, False, True], 
     [ True, False, True]]], dtype=bool) 

3) ALL матч по последних двух осей и, наконец, ANY матч:

In [71]: (a==b).all(axis=(1,2)) 
Out[71]: array([False, True, False, False, False], dtype=bool) 

In [72]: ((a==b).all(axis=(1,2))).any() 
Out[72]: True 

После аналогичных шагов для c в a -

In [73]: c 
Out[73]: 
array([[300, 200, 0], 
     [ 0, 100, 100]]) 

In [74]: ((a==c).all(axis=(1,2))).any() 
Out[74]: False 
+0

Спасибо за сохранение дня! Итак, нет простого способа, как «в» проверить существование на массиве numpy? – akilat90

+0

@ akilat90 Я боюсь, что нет. Или просто оберните его в функцию, и там вы идете, сделанный на заказ 'прямолинейный' путь! – Divakar

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