我有以下问题:给定一个长度为n
的向量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
函数代替乘法,使用差分算子,然后取矩阵的上三对角部分,计算得到的矩阵的和。
发布于 2014-11-15 08:14:20
如果我正确理解您的问题,k
th元素将被添加(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
发布于 2014-11-15 08:13:18
您可以使用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
发布于 2014-11-15 08:16:43
我假设,如果在计算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)])
https://stackoverflow.com/questions/26943898
复制相似问题