我怎样才能向量化这个操作?

How can i vectorize this operation?

我必须执行以下操作数千次,这大大降低了我的代码速度:

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() 这甚至可能吗?

这些操作都是一样的。您已经找到了(可能是最快的)矢量化操作。

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

问题可能是 floating-point 错误,无论您使用什么方法来确定它们是否“相同”。 np.allclose() 是解决方案。它舍入了使用 floats.

的不同计算方法之间出现的非常小的错误

正如@QuangHoang 在评论中所说的那样,y.T @ x 更具可读性