Python 如何将此操作矢量化?
我必须执行以下操作数千次,这大大降低了我的代码速度:Python 如何将此操作矢量化?,python,numpy,vectorization,numpy-einsum,Python,Numpy,Vectorization,Numpy Einsum,我必须执行以下操作数千次,这大大降低了我的代码速度: T=50 D=10 K=20 x=np.random.randn(T,D) y=np.random.randn(T,K) 结果=np.零((K,D)) 对于范围(k)内的k: 对于范围内的t(t): 结果[k]+=y[t,k]*x[t]#将y中的标量元素与x中的行相乘 基本上,我试图将矩阵y的k列中的每个元素与x中相应的行相加,并将它们相加。我尝试使用np.einsum()来解决这个问题: result=np.einsum(“ij,ik->
T=50
D=10
K=20
x=np.random.randn(T,D)
y=np.random.randn(T,K)
结果=np.零((K,D))
对于范围(k)内的k:
对于范围内的t(t):
结果[k]+=y[t,k]*x[t]#将y中的标量元素与x中的行相乘
基本上,我试图将矩阵y
的k
列中的每个元素与x
中相应的行相加,并将它们相加。我尝试使用np.einsum()
来解决这个问题:
result=np.einsum(“ij,ik->jk”,y,x)
这至少给了我
result.shape==(K,D)
,但结果不匹配!如何有效地执行此操作?使用np.einsum()
,这是否可能?这些操作是相同的。您已经找到了(可能是最快的)矢量化操作
T = 50
D = 10
K = 20
x = np.random.randn(T, D)
y = np.random.randn(T, K)
result = np.zeros((K, D))
for k in range(K):
for t in range(T):
result[k] += y[t, k] * x[t]
result2 = np.einsum("ij,ik->jk", y, x)
np.allclose(result, result2)
Out[]: True
问题很可能是浮点数错误,无论您使用什么方法来确定它们是否“相同”。np.allclose()
就是解决这个问题的方法。它使用float
s来舍入不同计算方法之间出现的非常小的错误
正如@QuangHoang在评论中指出的那样,
y.T@x
更具可读性您是否尝试过np.matmul(np.transpose(y),x)
?您的公式等于y^T*x
,其中乘积是矩阵积(如线性代数中)也等于矩阵乘法:y.T@x
。不幸的是(np.matmul(np.transpose(y),x)!=result)。sum()
产生140
,因此200个元素中有140个是不相等的!这同样适用于y.T@x
(当然)这是浮点错误,请看我的回答哦,伙计,我真的应该使用np.allclose()
!谢谢你提醒我这个功能。另外,我想我的目标是一个简单的矩阵乘法,这在我试图实现的论文中太隐蔽了。谢谢你的回答!