作为批量欧几里得距离计算的一部分,我正在计算
(X * X).sum(axis=1)
是X
一个相当大的二维数组。这很好用,但它构造了一个与X
. 有什么办法可以摆脱这种暂时的,但保持矢量化操作的效率?
显而易见的候选人,
np.array([np.dot(row, row) for row in X])
有效,但使用 Python 列表作为临时列表,使其相当慢。
如果没有axis
,内存有效的形式将是
(X * X).sum() => np.dot(X.ravel(), X.ravel())
我知道,当 时axis=1
,它相当于
np.diag(np.dot(X, X.T))
这让我研究了dot
诸如np.inner
,np.tensordot
和之类的概括np.einsum
,但我不知道它们将如何解决我的问题。