【发布时间】:2019-12-18 08:56:13
【问题描述】:
我有一个向量a,需要对两个索引进行求和,比如
for i in (range, n):
for j in (i+1, n):
F(a[i] - a[j])
其中F 是一个函数:sum 提醒我们对数组的上三角形求和。
我阅读了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,但我想知道是否有更快、更简单的方法。
在另一种情况下,函数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])
我想知道最有效的方法。
非常感谢
【问题讨论】:
-
您能分享一下您正在使用的实际
F吗? -
@Divakar, F = a[i]*a[j] * G( a[i]-a[j]),其中 G 是以 a[i] 为参数的 Mittag Leffler 函数- 一个[j]。我想已经知道如何处理我在帖子中描述的示例函数对我很有用。事实上,我已经不确定如何最好地处理 F = a[i] - a[j]。非常感谢
-
这个问题取决于函数 G。对于求和问题,很容易实现 Cython 或 Numba 解决方案。但是要获得良好的加速,您还必须将函数 G 实现为 Cython cdef 或使用 Numba 或包装 C 实现
-
我理解特定的函数 G 会影响最优方法的选择。正如我所提到的,我已经满足于学习如何处理我提到的示例 np.exp(a[i] - a[j]),而不使用 sum()
-
对此不确定,但它可能有助于存储 a[i],因此您不必重新检索该值