在使用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上。