我怎样才能向量化这个操作?
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()
是解决方案。它舍入了使用 float
s.
的不同计算方法之间出现的非常小的错误
正如@QuangHoang 在评论中所说的那样,y.T @ x
更具可读性
我必须执行以下操作数千次,这大大降低了我的代码速度:
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()
是解决方案。它舍入了使用 float
s.
正如@QuangHoang 在评论中所说的那样,y.T @ x
更具可读性