用点积广播
Broadcasting with dot product
我正在尝试求解一组点积。目前,我发现最好的方法是使用这个循环。
for i in range(n):
u[:,:,i] = np.dot(K[i,:,:], v[:,:,i])
有人可以通过广播或其他更快的方法帮助我解决这个问题吗?
非常感谢
一个简单的解决方法是:
u = np.matmul(K, v.transpose(2, 0, 1))
u = u.transpose(1, 2, 0)
我假设 K
的形状为 n x b x c,v
的形状为 c x d x n。像这样转置 v
使其成为 n x c x d 形状,这使得可以对输入形状 b x c 和 c x d 执行 n 次矩阵乘法,结果为 n x b x d。
最后,您还需要转置 u
以获得所需的 b x d x n 形状。
比手动绕轴移动更直观可读的解决方案是使用 np.einsum
来计算结果:
import numpy as np
n = 7
b = 8
c = 11
d = 4
K = np.random.rand(n, b, c)
v = np.random.rand(c, d, n)
u = np.matmul(K, v.transpose(2, 0, 1)).transpose(1, 2, 0)
w = np.einsum('nbc,cdn->bdn', K, v)
print(np.allclose(u, w)) # True
我正在尝试求解一组点积。目前,我发现最好的方法是使用这个循环。
for i in range(n):
u[:,:,i] = np.dot(K[i,:,:], v[:,:,i])
有人可以通过广播或其他更快的方法帮助我解决这个问题吗?
非常感谢
一个简单的解决方法是:
u = np.matmul(K, v.transpose(2, 0, 1))
u = u.transpose(1, 2, 0)
我假设 K
的形状为 n x b x c,v
的形状为 c x d x n。像这样转置 v
使其成为 n x c x d 形状,这使得可以对输入形状 b x c 和 c x d 执行 n 次矩阵乘法,结果为 n x b x d。
最后,您还需要转置 u
以获得所需的 b x d x n 形状。
比手动绕轴移动更直观可读的解决方案是使用 np.einsum
来计算结果:
import numpy as np
n = 7
b = 8
c = 11
d = 4
K = np.random.rand(n, b, c)
v = np.random.rand(c, d, n)
u = np.matmul(K, v.transpose(2, 0, 1)).transpose(1, 2, 0)
w = np.einsum('nbc,cdn->bdn', K, v)
print(np.allclose(u, w)) # True