Numpy高效矩阵自乘(克矩阵)

时间:2018-06-07 04:50:39

标签: python numpy matrix-multiplication

我希望将B = A @ A.T乘以numpy。显然,答案是对称矩阵(即B[i, j] == B[j, i])。

然而,我不清楚如何轻松地利用这一点将计算时间缩短一半(仅计算B的下三角形,然后使用它来免费获得上三角形)。

有没有办法以最佳方式执行此操作?

2 个答案:

答案 0 :(得分:7)

如@PaperPanzer的链接所述,dot可以检测到这种情况。这是时间证明:

In [355]: A = np.random.rand(1000,1000)
In [356]: timeit A.dot(A.T)
57.4 ms ± 960 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [357]: B = A.T.copy()
In [358]: timeit A.dot(B)
98.6 ms ± 805 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Numpy dot too clever about symmetric multiplications

答案 1 :(得分:0)

您始终可以使用sklearns's pairwise_distances

用法:

from sklearn.metrics.pairwise import pairwise_distances
gram = pairwise_distance(x, metric=metric)

其中metric是可调用的或字符串,用于定义其中一个已实施的指标(上面链接中的完整列表)

但是,我为自己写了一段时间,所以我可以分享我的所作所为:

import numpy as np

def computeGram(elements, dist):
    n    = len(elements)
    gram = np.zeros([n, n])
    for i in range(n):
        for j in range(i + 1):
            gram[i, j] = dist(elements[i], elements[j])

    upTriIdxs       = np.triu_indices(n)
    gram[upTriIdxs] = gram.T[upTriIdxs]

    return gram

dist是可调用的,在您的情况下np.inner

相关问题