【发布时间】:2020-11-06 19:01:06
【问题描述】:
我必须执行以下操作数千次,这大大减慢了我的代码:
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] # Multiply scalar element in y with row in x
基本上,我试图将矩阵y 的列k 中的每个元素与x 中的相应行相加并将它们相加。我尝试使用np.einsum() 来解决这个问题:
result = np.einsum("ij,ik->jk", y, x)
这至少给了我result.shape == (K, D),但结果不匹配!我怎样才能有效地执行这个操作? np.einsum() 甚至可以做到这一点吗?
【问题讨论】:
-
你试过
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也是如此(当然) -
那是浮点错误,看我的回答
标签: python numpy vectorization numpy-einsum