Fre*_*Foo 9 python numpy linear-algebra
作为批量欧几里德距离计算的一部分,我正在计算
(X * X).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)
哪里X是一个相当大的二维数组.这工作正常,但它构造了一个与之相同大小的临时数组X.有没有办法摆脱这种暂时的,但保留矢量化操作的效率?
明显的候选人,
np.array([np.dot(row, row) for row in X])
Run Code Online (Sandbox Code Playgroud)
工作,但使用Python列表作为临时,使其相当慢.
没有axis,记忆效率的形式将是
(X * X).sum() => np.dot(X.ravel(), X.ravel())
Run Code Online (Sandbox Code Playgroud)
而且我知道,什么时候axis=1,它相当于
np.diag(np.dot(X, X.T))
Run Code Online (Sandbox Code Playgroud)
这让我寻找到的概括dot,如np.inner,np.tensordot和np.einsum,但我想不出他们将如何解决我的问题.
YXD*_*YXD 11
该einsum等效是:
np.einsum('ij,ij->i', X, X)
Run Code Online (Sandbox Code Playgroud)
虽然我不确定这是如何在内部工作所以它可能会或可能不会解决您的问题.
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |