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

用户名

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

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

F函数在哪里:求和是在对数组的上三角求和。

以numpy的最快方式阅读了有趣的线程,以对内存最少的上三角元素求和,并进行了试验:确实,ARRAY.sum是对上三角矩阵的元素求和的非常快速的方法。

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

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

然后计算

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

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

在另一种情况下,该函数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()或嵌套循环要快得多

F例如,如果更明确

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

我想知道最有效的方法。

非常感谢

丹尼尔·F

您可以使用scipy.spatial.pdist度量标准并为其设置任何功能。另外,pdist仅计算非对角三角形,因此您无需将其从sum

from scipy.spatial.distance import pdist

def sum_upper_tri(arr, F = lambda x, y: x*y):
    return pdist(arr.reshape(arr.shape[0], -1), metric = F).sum()/2

但是,如果您想要一些超级快的东西,您将需要numba

from numba import jit

@jit
def sum_upper_tri_jit(arr, F = lambda x, y: x * y):
    out = 0
    for i in range(1, len(arr)):
        for j in range(i + 1, len(arr)):
            out += F(arr[i], arr[j])
    return out / 2

还没有找到解决方法@njit,但是如果可以的话,它会更快。

在任何情况下,每一个预期的特制功能F都会更快。例如,exp(|x-y|)大小写(exp(x-y)不对称的提示:xy!= yx)

from numba import njit

@njit
def sum_upper_tri_exp(arr):
    out = 0
    for i in range(1, len(arr)):
        for j in range(i + 1, len(arr)):
            out += np.exp(np.abs(arr[i] - arr[j]))
    return out / 2

这比上述速度快约100倍

如果您不想求和,可以使用:

from numba import njit

@njit
def sum_upper_tri_exp(arr):
    out = []
    for i in range(1, len(arr)):
        for j in range(i + 1, len(arr)):
            out += [np.exp(arr[i] - arr[j])]
    return out

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

numpy:将方矩阵的索引转换为其上三角索引的有效方法

在Tensorflow / Keras中获得对称矩阵上三角的最有效方法是什么?

有效存储三角矩阵

使用RcppArmadillo用向量填充上三角矩阵(包括对角线)

将向量替换为具有不同长度的上三角矩阵

提取R中矩阵的相应上三角和下三角元素

如何有效地将三角矩阵存储在内存中?

获取带有索引的矩阵上三角的值

将R中的矩阵转换为具有相应条目的上三角/下三角矩阵

Clojure:在给定矩阵的情况下获取上三角矩阵的函数

Scala中的上三角矩阵

上三角矩阵算法的逆

从执行顺序运算的向量创建三角矩阵

如何在Python中仅有效地计算此操作的上三角?

用向量替换三角形矩阵的一部分

计算lcm(i,j),i和j之和的范围是1到k的最有效方法是什么?

将R中的向量按特定顺序转换为下/上三角矩阵

将具有NumPy矩阵不同值部分的上三角形和下三角形提取到2列熊猫中

numpy / scipy:用一维向量的元素填充数组的上三角?

制作一个用Nan而不是零填充的Numpy上三角矩阵

用Java表示上三角矩阵的最佳数据结构是什么?

有效创建三对角矩阵

用C ++打印带有给定字母的三角形

从给定向量生成矩阵

检查上三角矩阵或下三角矩阵

NumPy-创建具有对角线幂的上三角矩阵

标识矩阵的第n个插入元素,该元素通过插入交替的上三角元素和下三角元素来填充

从非对称矩阵获取上三角矩阵

给定位置矩阵和值向量修改空矩阵