Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将此操作矢量化?_Python_Numpy_Vectorization_Numpy Einsum - Fatal编程技术网

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()
!谢谢你提醒我这个功能。另外,我想我的目标是一个简单的矩阵乘法,这在我试图实现的论文中太隐蔽了。谢谢你的回答!