Numpy 点积广播

Numpy 点积广播,numpy,broadcast,Numpy,Broadcast,我正在尝试解一组点积。目前,我发现最好的方法就是使用这个循环 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的形状是nxbbxc,v的形状是cxdn。像这样转置v使其成为nxcxd形状,这使得可以对输入

我正在尝试解一组点积。目前,我发现最好的方法就是使用这个循环

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
的形状是nxbbxc,
v
的形状是cxdn。像这样转置
v
使其成为nxcxd形状,这使得可以对输入形状bxc和cxd执行n个矩阵乘法,结果是nxbxd


最后,您还需要转置
u
以获得所需的b x d x n形状。

一个比手动绕轴移动更直观的解决方案将用于计算结果:

将numpy导入为np
n=7
b=8
c=11
d=4
K=np.rand.rand(n,b,c)
v=np.rand.rand(c,d,n)
u=np.matmul(K,v.转置(2,0,1)).转置(1,2,0)
w=np.einsum('nbc,cdn->bdn',K,v)
打印(np.allclose(u,w))#真实

K和v的形状是什么?或者它们代表什么?您不希望
广播
<编码>点进行前导维度的广播,
u[i,j,:,:]=np.dot(K[i,:,;],v[j,:,:])
matmul
将它们视为“批处理”维度,
u[i,:,:]=np.dot([K[i,:,:],v[i,:,:]))
@swag2198 K的形状是nxbxc,v的形状是cxdxn.@hpaulj我不一定想做广播,只要尽可能避免for循环。如果你不想做
np.matmul
所要求的转置,你可以使用
np.einsum
进行探索。