Эффективная попарная сумма - PullRequest
0 голосов
/ 21 марта 2020

Я ищу способ оптимизировать следующий код. Он вычисляет все возможные попарные суммы элементов в массиве:

import numpy as np
from itertools import combinations

N = 5000
a = np.random.rand(N)

c = ([a[i]+a[j] for i,j in combinations(range(N),2)])

Это относительно медленно. Я мог бы добиться гораздо лучших результатов, используя следующее:

b = a+a[:,None]
c = b[np.triu_indices(N,1)]

, но все еще кажется неоптимизированным: вычисление полной матрицы b неэффективно, потому что половина ее оказывается бесполезной, и извлечение ее верхней части (опуская диагональ) на самом деле даже медленнее, чем вычисления б.

Есть ли способ сделать это быстрее? Это заставляет меня думать о подобной проблеме, вычисляя попарные расстояния между точками ( Наибольшее попарное расстояние метри c в python), но я не знаю, есть ли способ сделать что-то подобное здесь, используя scipy.

edit: я хотел бы сохранить порядок сумм, чтобы результат содержал сумму индексов в следующем порядке: [(0,1), (0,2), .. . (0, N-1), (1,2), .... (1, N-1), (2,3), ...], то есть порядок, который вы получите, выполняя удвоение для l oop for 0=<i<N, for j<i<N

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