【发布时间】:2019-10-01 02:37:28
【问题描述】:
我只是想做:C_i=\Sum_k (A_i -B_k)^2
我看到使用简单的for loop 进行此计算比使用numpy.subtract.outer 更快!无论如何,我觉得numpy.einsum 会是最快的。我无法理解numpy.einsum。谁能帮帮我?此外,如果有人解释如何用numpy.einsum 编写由向量/矩阵组成的一般求和表达式,那就太好了?
我没有在网上找到解决这个特定问题的方法。抱歉,如果以某种方式重复。
带循环的 MWE 和 numpy.subtract.outer--
A)带循环
import timeit
code1="""
import numpy as np
N=10000;
a=np.random.rand(N); b=10*(np.random.rand(N)-0.5);
def A1(x,y):
Nx=len(x)
z=np.zeros(Nx)
for i in np.arange(Nx):
z[i]=np.sum((x[i]-y)*(x[i]-y))
return z
C1=A1(a,b)"""
elapsed_time = timeit.timeit(code1, number=10)/10
print "time=", elapsed_time
B) 与numpy.subtract.outer
import timeit
code1="""
import numpy as np
N=10000;
a=np.random.rand(N); b=10*(np.random.rand(N)-0.5);
def A2(x,y):
C=np.subtract.outer(x,y);
return np.sum(C*C, axis=1)
C2=A2(a,b)"""
elapsed_time = timeit.timeit(code1, number=10)/10
print "time=", elapsed_time
对于 N=10000,循环变得更快。对于 N=100,外部减法变得更快。对于 N=10^5,外部减法在我的 8GB 内存的桌面上面临内存问题!
【问题讨论】:
-
einsum是矩阵乘积的推广。使用一组通用维度是在选定维度上执行产品总和。换句话说,它是C_? = sum_? A_? * B_?。 -
谢谢!我还发现
einsum的主要用途是乘法。但是我们仍然可以用它做上面的总结吗?如果不是,那么针对这些情况的优化解决方案是什么?与 C 相比,python 中的for循环非常慢。 -
数组
A和B的典型大小是多少? -
你
saw循环比使用subtract.outer快吗?在哪里?你能示范一下吗?我还将使用广播测试outer的变体。 -
就我而言,尺寸为 10^8。但是我必须多次迭代这个计算,所以速度很重要。
标签: python arrays numpy numpy-einsum