如何在 Python 中使用 @ 将列向量与行向量相乘?

How do you multiply a column vector with a row vector using @ in Python?

我是运行以下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 的行向量矩阵相乘?

您需要使用二维数组来表示matrices/matrix乘法。

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

您在这里看到的是 属性 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

可以用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]])

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

矩阵乘法只有效,因为 @ 特殊对待一维操作数。在左边,它们将隐式地成为一行,在右边成为一列。添加的维度将从结果中删除。所以a@b给出了内积。

a@b
# 11

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

ac,br = np.ix_(a,b)

ac@br
# array([[3, 4],
#        [6, 8]])