Пересекаются между 1D и каждой строкой в ​​2D? Счетчик перекрытий? - PullRequest
0 голосов
/ 04 марта 2020

Вы можете использовать numpy .intersect1d (a1, a2), а затем документы предоставляют возможность пересекать несколько массивов:

уменьшать (np.intersect1d, ([1, 3, 4 , 3], [3, 1, 2, 1], [6, 3, 4, 2]))

Что я хочу сделать, это найти пересечение между массивом 1D и каждым строка в соответствующем двумерном массиве.

Или лучше , но только COUNT перекрывающихся элементов в каждой строке.

Я знаю, что могу сделать это с помощью intersect1d () и al oop, но это будет слишком медленно .

Как мы можем подсчитать перекрывающиеся элементы в каждом ряду numpy -way ?


Пример:

In [59]: a2 = np.random.choice(np.arange(0,100),(10,5), replace=False)

In [60]: a2
Out[60]: 
array([[50,  5, 25, 40, 19],  1
       [43, 37, 21, 55, 11],  0
       [16, 49,  6, 86, 96],  0
       [80, 66, 87, 51, 64],  0
       [42,  7, 20, 24, 74],  1
       [92, 63, 75, 54, 90],  2
       [ 9, 91, 88, 85, 22],  0
       [ 4, 65, 97, 93, 53],  0
       [18,  0, 57, 71, 76],  0
       [94,  1, 77, 89, 45]]) 0

In [61]: a1 = np.random.choice(np.arange(0,100),5, replace=False)


In [63]: a1
Out[63]: array([63, 54, 20, 60, 25])

1 Ответ

2 голосов
/ 04 марта 2020

Чтобы просто получить количество общих элементов в строке, мы можем получить маску совпадений с np.isin, а затем просто количество в строке -

np.isin(arr2D,arr1D).sum(axis=1)

Если вы хотите подсчитать каждый уникальный элемент только один раз в случае дублирования вхождений в строке и если входные элементы являются положительными числами, нам нужно еще несколько шагов -

# https://stackoverflow.com/a/46256361/ @Divakar
def bincount2D_vectorized(a):    
    N = a.max()+1
    a_offs = a + np.arange(a.shape[0])[:,None]*N
    return np.bincount(a_offs.ravel(), minlength=a.shape[0]*N).reshape(-1,N)

count = (bincount2D_vectorized(np.isin(arr2D,arr1D)*arr2D)[:,1:]!=0).sum(1)
...