如何修复。ValueError: 操作数不能与形状一起广播

527 阅读2分钟

在使用Python时,你可能遇到的一个错误是。

ValueError: operands could not be broadcast together with shapes (2,2) (2,3) 

当你试图在Python中使用乘法符号(*)而不是**numpy.dot()**函数进行矩阵乘法时,会发生这个错误。

下面的例子说明了在每种情况下如何解决这个错误。

如何重现这个错误

假设我们有一个2×2的矩阵C,它有2行和2列。

假设我们也有一个2×3的矩阵D,它有2行3列。

下面是矩阵C乘以矩阵D的方法。

这样就得到了以下矩阵。

假设我们试图在Python中使用乘法符号(*)来执行这个矩阵乘法,如下。

import numpy as np

#define matrices
C = np.array([7, 5, 6, 3]).reshape(2, 2)
D = np.array([2, 1, 4, 5, 1, 2]).reshape(2, 3)

#print matrices
print(C)

[[7 5]
 [6 3]]

print(D)

[[2 1 4]
 [5 1 2]]

#attempt to multiply two matrices together
C*D

ValueError: operands could not be broadcast together with shapes (2,2) (2,3)  

我们收到一个ValueError。我们可以参考NumPy的文档来了解为什么我们会收到这个错误。

当对两个数组进行操作时,NumPy对它们的形状进行元素比较。它从尾部(即最右边)的维度开始,然后向左移动。两个维度是兼容的,当

  • 它们是相等的,或者
  • 其中一个是1

如果不满足这些条件,就会抛出ValueError:操作数不能一起广播的异常,表明数组的形状不兼容。

由于我们的两个矩阵的尾部维度值不一样(矩阵C的尾部维度为2,矩阵D的尾部维度为3),我们收到一个错误。

如何修复该错误

解决这个错误的最简单方法是简单地使用**numpy.dot()**函数来执行矩阵乘法。

import numpy as np

#define matrices
C = np.array([7, 5, 6, 3]).reshape(2, 2)
D = np.array([2, 1, 4, 5, 1, 2]).reshape(2, 3)

#perform matrix multiplication
C.dot(D)

array([[39, 12, 38],
       [27,  9, 30]])

注意,我们避免了ValueError,我们能够成功地将两个矩阵相乘。

还要注意的是,结果与我们之前手工计算的结果一致。

其他资源

下面的教程解释了如何修复 Python 中的其他常见错误。

如何修复:列重叠但没有指定后缀
如何修复:'numpy.ndarray'对象没有属性'append'
如何修复:如果使用所有标量值,必须传递一个索引
如何修复。ValueError:无法将浮点数NaN转换为整数

The postHow to Fix:ValueError:操作数不能与形状一起广播出现在Statology上。