作为批次欧几里德距离计算的一部分,我正在计算
(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
,但我无法弄清楚它们如何解决我的问题。< / p>
答案 0 :(得分:11)
einsum
等价物是:
np.einsum('ij,ij->i', X, X)
虽然我不确定这是如何在内部工作的,但它可能会或可能不会解决您的问题。