#python #numpy
#python #numpy
Вопрос:
Я использую Python 3.8, и мне нужно эффективно вычислять количество совпадений чисел в списке списков.
У меня есть следующий массив:
x = [[1, 3, 4], [5, 11, 4, 4], ...]
Я хочу вычислить матрицу совпадений следующим образом:
C[i][j] = # freq(i) * freq(j) summed over all lists k in x
В настоящее время я векторизовал вычисления для каждого списка в x следующим образом:
for l in x:
freqs = np.bincount(l, minlength=SIZE)
C[freqs > 0] = np.outer(freqs[freqs != 0], freqs)
Проблема в том, что я не вижу способа векторизовать этот внешний цикл. Я также не вижу способа легко ускорить его с помощью параллелизма. C может содержать ~ 1B записей, поэтому параллелизм типа слияния будет сложным для памяти.
Есть ли способ ускорить это?
Примечание: x может иметь ~ 2,5 Млн списков, а C может иметь стороны 75 тыс. (уникальные элементы)
Комментарии:
1. У вас есть массив NxM (который вы можете представить с помощью numpy ndarray), или, как в вашем примере, предлагается просто список списков разной длины?
2. просто список списков с разной длиной. x может содержать более 2 элементов, поэтому массив NxM будет слишком большим
3. Таким образом, вы, вероятно, не сможете легко векторизовать его, используя
numpy
, тогда. Вы можете попробоватьnumba
, если хотите придерживаться Python.4. Поскольку каждая итерация внешнего цикла несет значительную полезную нагрузку, векторизация не сильно сэкономит вам, потому что отношение накладных расходов к работе уже невелико.