gpt4 book ai didi

python - 在给定向量 a 的情况下,在矩阵 F(a[i], a[j]) 上使用 .sum 执行三角求和的有效方法

转载 作者:行者123 更新时间:2023-12-01 13:11:51 24 4
gpt4 key购买 nike

我有一个向量 a 并且需要对两个索引执行求和,例如

for i in (range, n): 
for j in (i+1, n):
F(a[i] - a[j])

其中 F 是一个函数:求和让人想起对数组的上三角求和。

我在 Fastest way in numpy to sum over upper triangular elements with the least memory 上阅读了有趣的帖子并做了我的试验:ARRAY.sum 确实是一种对上三角矩阵的元素求和的非常快速的方法。

要将该方法应用于我的案例,我首先需要定义一个数组,例如

A[i,j] = F(a[i],a[j])

然后计算

(A.sum() - np.diag(A).sum())/2

当然,我可以通过两个 for 循环定义数组 A,但我想知道是否有更快、numpy 的方法。

在另一种情况下,函数 F 简单地等于

F = a[i]*a[j]

我会写

def sum_upper_triangular(vector):
A = np.tensordot(vector,vector,0)
return (A.sum() - np.diag(A).sum())/2

这比直接使用 sum() 或嵌套 for 循环求和要快得多。

如果F更加清晰,例如

np.exp(a[i] - a[j])

我想知道什么是最有效的方法。

非常感谢

最佳答案

如果我理解正确,你想执行以下操作:

result = []
n = len(a)
for i in range(n-1):
for j in range(i+1, n):
result.append(F(a[i] - a[j]))

对于某些函数 F。此外,矩阵元素之间的运算可以是任何其他运算(例如乘法 *)。下面是一种不使用 for 循环的方法:

iu = np.triu_indices(n, k=1)
A_j, A_i = np.meshgrid(a, a)
res = F(A_i[iu] - A_j[iu]) # e.g. F = np.exp

解释(对于 n=5):

A_i = [[a[0], a[0], a[0], a[0], a[0],
[a[1], a[1], a[1], a[1], a[1],
[a[2], a[2], a[2], a[2], a[2],
[a[3], a[3], a[3], a[3], a[3],
[a[4], a[4], a[4], a[4], a[4]]

A_j = [[a[0], a[1], a[2], a[3], a[4],
[a[0], a[1], a[2], a[3], a[4],
[a[0], a[1], a[2], a[3], a[4],
[a[0], a[1], a[2], a[3], a[4],
[a[0], a[1], a[2], a[3], a[4]]

A_i[iu] = [a[0], a[0], a[0], a[0], a[1], a[1], a[1], a[2], a[2], a[3]]
A_j[iu] = [a[1], a[2], a[3], a[4], a[2], a[3], a[4], a[3], a[4], a[4]]

然后执行逐元素计算并应用逐元素 F:

F(A_i[iu] - A_j[iu]) = [ 
F(a[0] - a[1]), F(a[0] - a[2]), F(a[0] - a[3]), F(a[0] - a[4]),
F(a[1] - a[2]), F(a[1] - a[3]), F(a[1] - a[4]),
F(a[2] - a[3]), F(a[2] - a[4]),
F(a[3] - a[4])]

关于python - 在给定向量 a 的情况下,在矩阵 F(a[i], a[j]) 上使用 .sum 执行三角求和的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com