Подсчет вхождений элементов одного массива в другой массив - PullRequest
0 голосов
/ 10 января 2019

Я хочу найти частоту элементов данного одномерного массива numpy (arr1) в другом одномерном массиве numpy (arr2). Массив arr1 содержит элементы без повторений. Кроме того, все элементы в arr1 являются частью массива уникальных элементов arr2

Рассмотрим это как пример,

arr1 = np.array([1,2,6])
arr2 = np.array([2, 3, 6, 1, 2, 1, 2, 0, 2, 0])

В настоящее время я использую следующее:

freq = np.zeros(  len(arr1)  )

for i in range( len(arr1) ):
    mark = np.where( arr2==arr1[i] )
    freq[i] = len(mark[0])

print freq
>>[2, 4, 1]

Вышеупомянутый метод дает мне правильный ответ. Но я хочу знать, есть ли лучший / более эффективный метод, чем тот, которому я следую.

1 Ответ

0 голосов
/ 10 января 2019

Вот векторизованное решение на основе np.searchsorted -

idx = np.searchsorted(arr1,arr2)
idx[idx==len(arr1)] = 0
mask = arr1[idx]==arr2
out = np.bincount(idx[mask])

Предполагается, что arr1 отсортировано. Если нет, мы получили два решения:

  1. Сортировка arr1 в качестве шага предварительной обработки. Поскольку arr1 является частью уникальных элементов из arr2, это должен быть сравнительно меньший массив и, следовательно, недорогая операция сортировки.

  2. Используйте sorter arg с searchsorted для вычисления idx:

    sidx = arr1.argsort(); idx = sidx[np.searchsorted(arr1,arr2,sorter=sidx)]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...