numpy矩阵乘法逐行

时间:2017-10-29 05:11:36

标签: python numpy matrix multiplication

我有一个矩阵,比如

a = np.array([[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]])

我希望得到一个新矩阵,其中每个元素都是a行的矩阵乘积:

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矩阵。

除了使用循环之外,还有更优雅的方法来实现吗?

2 个答案:

答案 0 :(得分:2)

使用NumPy broadcasting保持第一个轴对齐,并在第二个轴之间执行外部产品 -

a[:,:,None]*a[:,None,:] # or a[...,None]*a[:,None]

使用np.einsum,转换为 -

np.einsum('ij,ik->ijk',a,a)

答案 1 :(得分:0)

我可能会遗漏一些东西,但这不仅仅是矩阵乘法吗?

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