求和矢量中所有唯一的对差异

时间:2014-11-15 08:07:24

标签: python

我遇到以下问题:给定长度为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函数而不是乘法,使用差分运算符,然后取矩阵的上三对角部分并计算结果矩阵的总和。

3 个答案:

答案 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.combinationsmap()功能:

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_jx_j - x_i以及i < j之间有选择,那么您选择x_i - x_j。然后答案是:

n = len(v)
sum([(n - 1 - 2*i)*x for i, x in enumerate(v)])