如何在 python 中将特定的 rows/columns 矩阵相互相乘?

How to multiply specific rows/columns of matrices with each other in python?

我必须输入形状矩阵

m1: (n,3)
m2: (n,3)

我想将每一行(每个 n 的大小为 3)与其对应的另一个矩阵相乘,这样我得到每一行的 (3,3) 矩阵。

当我试图只使用例如m1[0]@m2.T[0] 该操作不起作用,因为 m[0] 提供了一个 (3,) 列表而不是 (3,1) 矩阵,我可以在其上使用矩阵操作。

是否有相对简单或优雅的方法来获得所需的 (3,1) 矩阵乘法矩阵?

一般来说,我建议对大多数矩阵运算使用 np.einsum,因为它非常优雅。 要获得形状为 (n, 3)m1m2 中包含的向量的行外积,您可以执行以下操作:

import numpy as np
m1 = np.array([1, 2, 3]).reshape(1, 3)
m2 = np.array([1, 2, 3]).reshape(1, 3)
result = np.einsum("ni, nj -> nij", m1, m2)
print(result)
>>>array([[[1, 2, 3],
        [2, 4, 6],
        [3, 6, 9]]])

默认情况下,numpy 摆脱了单例维度,正如您所注意到的。
您可以使用 np.newaxis(或等同于 None。这是一个实现细节,但也可以在 pytorch 中使用)作为第二个轴来告诉 numpy “发明”一个新轴。

import numpy as np
a = np.ones((3,3))
a[1].shape                 # this is (3,)
a[1,:].shape               # this is (3,)
a[1][...,np.newaxis].shape # this is (3,1)

不过,也可以直接用dotouter

>>> a = np.eye(3)
>>> np.outer(a[1], a[1])
array([[0., 0., 0.],
       [0., 1., 0.],
       [0., 0., 0.]])
>>> np.dot(a[1], a[1])
1.0