首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向量中所有唯一对差之和

向量中所有唯一对差之和
EN

Stack Overflow用户
提问于 2014-11-15 08:07:23
回答 3查看 270关注 0票数 2

我有以下问题:给定一个长度为n的向量n,找出所有向量元素的唯一成对差之和。

我们不应该考虑操作数仅仅是交换的对,只是其中的一个(例如,如果计算了(x_i - x_j),就不要考虑(x_j - x_i) )。

例如:

代码语言:javascript
运行
复制
v = [4, 2, 1, 5]

和:(4-2) + (4-1) + (4-5) + (2-1) + (2-5) + (1-5)

使用两个嵌套的for循环很容易做到这一点。我需要在Python中非常有效地计算这一点,因为每个这样的和都与一个非常大且稀疏的矩阵一起使用。我正在反复处理几万个元素大小的向量。

有没有更优雅的方法?在R中,可以使用outer函数代替乘法,使用差分算子,然后取矩阵的上三对角部分,计算得到的矩阵的和。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-15 08:14:20

如果我正确理解您的问题,kth元素将被添加(n - 1 - 2 * k)时间,其中n是数组的长度。所以你可以这么做:

代码语言:javascript
运行
复制
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
票数 7
EN

Stack Overflow用户

发布于 2014-11-15 08:13:18

您可以使用itertools.combinationsmap()函数:

代码语言:javascript
运行
复制
sum(map(lambda x :x[0]-x[1] ,combinations(v,2)))

演示:

代码语言:javascript
运行
复制
>>> 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
EN

Stack Overflow用户

发布于 2014-11-15 08:16:43

我假设,如果在计算x_i - x_jx_j - x_i以及i < j之间有选择,那么您将选择x_i - x_j。答案是:

代码语言:javascript
运行
复制
n = len(v)
sum([(n - 1 - 2*i)*x for i, x in enumerate(v)])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26943898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档