NumPy矩阵和数组的点积

4

从 numpy 的文档中得知:https://numpy.org/doc/stable/reference/generated/numpy.dot.html#numpy.dot

numpy.dot(a, b, out=None)

计算两个数组的点积。具体来说,

  • 如果 a 和 b 均为 1-D 数组,则是向量的内积(不进行复共轭)。

  • 如果 a 和 b 均为 2-D 数组,则是矩阵乘法,但建议使用 matmul 或 a @ b。

  • 如果 a 或 b 是 0-D(标量),则等效于相乘并使用 numpy.multiply(a, b) 或 a * b。

  • 如果 a 是 N-D 数组且 b 是 1-D 数组,则是 a 和 b 的最后一个轴上的和积。

  • 如果 a 是 N-D 数组且 b 是 M-D 数组(其中 M>=2),则是 a 和 b 的最后一个轴与 b 倒数第二个轴的乘积之和:

根据第四点,如果我们对一个 2-D 数组 A 和一个 1-D 数组 B 进行点积运算,正确的做法应该是沿着 A 的列方向求和,并沿着 B 的行方向进行乘积,因为 A 的最后一个轴是列,对吗? 然而,当我在 Python IDLE 中尝试这样做时,输出结果如下:

>>> a
    array([[1, 2],
           [3, 4],
           [5, 6]])
>>> b
    [1, 2]
>>> a.dot(b)
    array([ 5, 11, 17])

我预计这会抛出一个错误,因为a的列数大于b的行数。

1个回答

1
如果a是一个N维数组,b是一个1维数组,那么它是a和b的最后一个轴上的乘积之和。a的最后一个轴大小为2:
>>> a.shape
(3, 2)

这与b的尺寸相匹配。

记住:在numpy中,多维数组的第一个轴是“向下”的。1D数组在numpy中以水平方式显示,但我认为将它们视为垂直向量通常更好。这就是正在计算的内容:

enter image description here


谢谢,这很有道理。但是,这是否意味着行向量是矩阵的“最后一个轴”?我对文档术语感到困惑。我认为在最后一个轴上进行的总和乘积必须是列向量,因为列是最后一个轴。 - user3882
@user3882 列不是最后一个轴。 - orlp
文档中没有使用“列”或“行”这些术语。虽然这些名称适用于二维数组,但在数组为一维时必须谨慎使用。 b 的形状是(2,)- 这是唯一的维度。 - hpaulj
@hpaulj 我知道,我从未声称过相反的观点。我说一维数组在显示上是水平的,但是在我的思考中(尤其是在线性代数的背景下),我经常将它们视为垂直向量,并非它们本质上就是这两者之一。它们当然是一维的。 - orlp
是的,形状元组有2个元素。(1,n)也是2D的。对于这些情况适用第二点。 - hpaulj
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接