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) 
+0

如果你看到我删除的答案,我在那里一半!下次我会做对,谢谢你的回答。 :) –

+1

@cᴏʟᴅsᴘᴇᴇᴅ是的,你很近! :) – Divakar

+0

非常感谢!我试过了,这正是我想要的。永远不要想象广播可以这样完成。 – JQK

我可能失去了一些东西,但不是这只是矩阵乘法?

>>> 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]]) 
+0

嗨percusse,感谢您的评论,但不,他们是不一样的。我正在计算类似[1,2,3]的东西.T * [1,2,3] = [[1,2,3],[2,4,6],[3,6,9]],但是你正在计算的是[1,2,3] * [1,2,3] .T = [14]。 – JQK

+0

@JQK我刚刚复制你的代码并比较结果。 – percusse

+0

是的,你似乎是正确的,但我没有时间检查它..谢谢你的帮助。 – JQK