【问题标题】:How do you multiply a column vector with a row vector using @ in Python?如何在 Python 中使用 @ 将列向量与行向量相乘?
【发布时间】:2019-09-16 18:10:18
【问题描述】:

我正在运行以下 Python 代码:

import numpy as np
a=np.array([1,2])
b=np.array([3,4])
a@b #11
a.T@b #11
a@b.T #11
a.T@b.T #11

所有四个操作都给出点积。我的理解是 ab 将是行向量,所以 a.T@b 将给出一个 2x2 矩阵。我在这里误解了什么以及如何将a 的列向量与b 的行向量进行矩阵相乘?

【问题讨论】:

    标签: python numpy matrix-multiplication


    【解决方案1】:

    您可以使用np.outer获取外产品

    >>> import numpy as np
    >>> a=np.array([1,2])
    >>> b=np.array([3,4])
    >>> np.outer(a, b)
    array([[3, 4],
           [6, 8]])
    

    【讨论】:

      【解决方案2】:

      您在此处看到的是 numpy 数组和矩阵如何工作的属性。
      您已经创建了 numpy 数组,每个 2 长,如果您转置,您仍然会得到一个长度为 2 的数组。如果您执行 a.shape,您可以看到这一点。您必须创建一个 1x2 矩阵,它会按预期工作:

      >>> a=np.array([[1,2]])
      >>> b=np.array([[3,4]])
      >>> a@b
      Error
      >>> a.T@b
      array([[3, 4],
             [6, 8]])
      >>> a@b.T
      array([[11]])
      >>> a.T@b.T
      Error
      

      【讨论】:

      • 好的,谢谢。当我做点积时,我现在得到[[11]]。如果我只想给自己编号,而不是输出另一个 2x2 矩阵的操作怎么办?
      • 你可以使用np.asscalar
      • 最后一点:我尝试做np.array([[2,2],[2,2]])@np.array([3,3]).T,它应该输出一个列向量,而是输出一个行向量。你知道这是为什么吗?
      【解决方案3】:

      你需要使用二维数组来表示矩阵/矩阵乘法。

      a = np.array([[1, 2]])
      b = np.array([[3, 4]])
      print(a.T @ b)
      

      【讨论】:

        【解决方案4】:

        首先,重要的是要了解您的ab 既不是行也不是列。它们是一维的。

        矩阵将它们相乘仅有效,因为@ 专门处理一维操作数。在左侧,它们将被隐式地设为一行,在右侧是一列。添加的尺寸将从结果中删除。所以 a@b 给出了内积。

        a@b
        # 11
        

        对于外积,我们需要构建二维向量。 将两个一维向量转换为一列和一行的便捷方法是np.ix_

        ac,br = np.ix_(a,b)
        
        ac@br
        # array([[3, 4],
        #        [6, 8]])
        

        【讨论】:

          猜你喜欢
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          相关资源
          最近更新 更多