numpy的矩阵乘法逐行
问题描述:
我有一个矩阵,像numpy的矩阵乘法逐行
a = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]])
,我希望得到一个新的矩阵,其中每个元素是一个行的矩阵产品,本身:
np.array([
np.dot(np.array([a[0]]).T, np.array([a[0]])),
np.dot(np.array([a[1]]).T, np.array([a[1]])),
np.dot(np.array([a[2]]).T, np.array([a[2]])),
np.dot(np.array([a[3]]).T, np.array([a[3]])),
])
这将是一个4x4矩阵,每个元素都有一个3x3矩阵。 之后,我可以总结0轴以获得新的3x3矩阵。
有没有更好的方法来实现这一点,除了使用循环?
答
使用NumPy broadcasting
保持第一轴线对齐,并且第二个之间进行外产品 -
a[:,:,None]*a[:,None,:] # or a[...,None]*a[:,None]
随着np.einsum
,翻译过来就是 -
np.einsum('ij,ik->ijk',a,a)
答
我可能失去了一些东西,但不是这只是矩阵乘法?
>>> a.T @ a
array([[30, 40, 50],
[40, 54, 68],
[50, 68, 86]])
>>> np.sum(np.array([
np.dot(np.array([a[0]]).T, np.array([a[0]])),
np.dot(np.array([a[1]]).T, np.array([a[1]])),
np.dot(np.array([a[2]]).T, np.array([a[2]])),
np.dot(np.array([a[3]]).T, np.array([a[3]])),
]), axis=0)
array([[30, 40, 50],
[40, 54, 68],
[50, 68, 86]])
如果你看到我删除的答案,我在那里一半!下次我会做对,谢谢你的回答。 :) –
@cᴏʟᴅsᴘᴇᴇᴅ是的,你很近! :) – Divakar
非常感谢!我试过了,这正是我想要的。永远不要想象广播可以这样完成。 – JQK