【问题标题】:How to multiply specific rows/columns of matrices with each other in python?如何在python中将矩阵的特定行/列相互相乘?
【发布时间】:2022-01-17 15:39:13
【问题描述】:

我必须输入形状矩阵

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

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

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

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

【问题讨论】:

  • 我认为你正在尝试做一个“外部”产品,产生一个 (n,3,3)。但我也看到@ 和“矩阵乘法”的使用暗示了inner 产品。你能把问题清理干净吗?更好的是,举一个小例子,例如。使用 (2,3) 数组,获得所需的结果。它将消除歧义。

标签: python numpy multidimensional-array matrix-multiplication


【解决方案1】:

如您所见,默认情况下,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

【讨论】:

  • 这对我有用
【解决方案2】:

一般来说,我建议对大多数矩阵运算使用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]]])

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2013-12-09
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多