我遇到以下问题:给定长度为x
的向量n
,找到向量元素的唯一成对差异的总和。
人们不应该考虑仅交换操作数的对,只考虑其中一个(例如,如果计算(x_i - x_j)
则不考虑(x_j - x_i)
。)
例如:
v = [4, 2, 1, 5]
总和:(4-2)+(4-1)+(4-5)+(2-1)+(2-5)+(1-5)
使用两个嵌套for循环很容易做到这一点。我需要在Python中非常有效地计算它,因为每个这样的和然后与非常大和稀疏的矩阵一起使用。我正在反复处理大小为数万个元素的向量。
有更优雅的方法吗?在R中,可以使用outer
函数而不是乘法,使用差分运算符,然后取矩阵的上三对角部分并计算结果矩阵的总和。
答案 0 :(得分:7)
如果我正确理解了您的问题,k
元素会被添加(n - 1 - 2 * k)
次,其中n
是数组的长度。所以你可以这样做:
v = [4, 2, 1, 5]
n = len(v)
s = 0 # this is going to be the sum
for idx, x in enumerate(v):
s += (n - 1 - 2 * idx) * x
print s
答案 1 :(得分:2)
您可以使用itertools.combinations
和map()
功能:
sum(map(lambda x :x[0]-x[1] ,combinations(v,2)))
演示:
>>> from itertools import combinations
>>> from operator import sub
>>> list(combinations(v,2))
[(4, 2), (4, 1), (4, 5), (2, 1), (2, 5), (1, 5)]
>>> [sub(i,j) for i,j in list(combinations(v,2))]
[2, 3, -1, 1, -3, -4]
>>> sum([sub(i,j) for i,j in list(combinations(v,2))])
-2
答案 2 :(得分:1)
我假设如果在计算x_i - x_j
和x_j - x_i
以及i < j
之间有选择,那么您选择x_i - x_j
。然后答案是:
n = len(v)
sum([(n - 1 - 2*i)*x for i, x in enumerate(v)])