【问题标题】:Getting value error while performing numpy.dot()执行 numpy.dot() 时出现值错误
【发布时间】:2023-07-21 00:41:01
【问题描述】:

我使用 numpy 创建了两个数组:

import numpy as np    
a = np.array([[1, 5, 7], [6, 8, 9]])
b = np.array([[1, 8, 8], [5, 8, 0], [8, 9, 0]])
np.dot(a, b)

现在,在执行 np.dot(a, b) 时出现错误:

ValueError: 操作数无法与形状 (2,3) (3,3) 一起广播。

通常,如果 a 的最后一个维度与 b 的倒数第二个维度的大小不同,则会引发值错误。我的代码有什么问题?

【问题讨论】:

  • @MeghaliAgrawal 你是对的。我想知道是否有版本差异...您使用的是哪一个?
  • 还有 NumPy 版本?
  • 我只是想知道......你确定你正在运行这个确切的代码吗?
  • @MeghaliAgrawal 你怎么会得到不同的结果 matrix multiplication ? ;) 请检查您的数组输入。您确定您正在运行您发布的代码吗?
  • 这里有问题...这是需要截图来说服的罕见情况...

标签: python numpy multidimensional-array valueerror dot-product


【解决方案1】:

您的代码运行良好。请注意,当np.dot() 的输入是矩阵时,np.dot() 执行矩阵乘法

In [18]: a = np.array([[1, 5, 7], [6, 8, 9]])
    ...: b = np.array([[1, 8, 8], [5, 8, 0], [8, 9, 0]])
    ...: 

# @ is equivalent to `np.dot()` and `np.matmul()` in Python 3.5 and above
In [19]: a @ b
Out[19]: 
array([[ 82, 111,   8],
       [118, 193,  48]])


In [20]: (a @ b).shape
Out[20]: (2, 3)

# sanity check!
In [22]: a @ b == np.matmul(a, b)
Out[22]: 
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

注意@:它是在 Python 3.5 中作为 dedicated infix operator for matrix multiplication 引入的

这是因为* 运算符是否进行矩阵乘法或逐元素乘法存在一些混淆。因此,为了消除混淆,指定了一个专用运算符@ 用于矩阵乘法。所以,

* 执行逐元素乘法
@ 执行矩阵乘法(点产品)


【讨论】:

  • 使用二维 NumPy 数组 ab 执行无忧点积的最简单方法是 (a * b).sum(axis=-1)