平方数组的总和



作为批量欧几里得距离计算的一部分,我正在计算

(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.innernp.tensordotnp.einsum,但我无法弄清楚它们将如何解决我的问题。

einsum等价物是:

np.einsum('ij,ij->i', X, X)

虽然我不确定这在内部是如何工作的,所以它可能会也可能不会解决您的问题。

相关内容

  • 没有找到相关文章

最新更新