平方数组求和

时间:2013-09-30 12:35:24

标签: python numpy linear-algebra

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

(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,但我无法弄清楚它们如何解决我的问题。< / p>

1 个答案:

答案 0 :(得分:11)

einsum等价物是:

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

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