如何在 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)
的 m1
和 m2
中包含的向量的行外积,您可以执行以下操作:
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)
不过,也可以直接用dot
或outer
:
>>> 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
我必须输入形状矩阵
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)
的 m1
和 m2
中包含的向量的行外积,您可以执行以下操作:
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)
不过,也可以直接用dot
或outer
:
>>> 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