在进行矩阵计算的时候遇到的错误,为了方便理解,以3*2和2*3的矩阵为例。
ValueError: operands could not be broadcast together with shapes (3,2) (2,3)
import numpy as np
a=np.array([[1,2],[3,4],[5,6]])
b=np.array([[1,1,1],[2,2,2]])
print(a*b)
这里是想要进行矩阵乘法,结果报错。
m=np.dot(a,b)
要想进行矩阵乘法需要使用np.dot();
直接a*b被认为是numpy中元素一一对应的方式进行计算的,其中隐式的将一个向量复制到每一行而生成一个矩阵。这种隐式地复制向量到很多位置的方式,被称为广播(broadcast)。
要想进行广播需要满足三个条件:
1.当两个矩阵shape相同的时候,直接进行计算。
2.当两个矩阵shape不相同的时候,当且仅当不相同的两个轴的其中一个长度为1的时候,就会沿着这个轴,将其他方向的值复制
扩展为所需大小的矩阵。
3.输出的数组的大小是输入数组的各个轴的最大值。
例1
a=np.array([[1,2],[3,4],[5,6]])
b=np.array([1,2,1])
print(a*b)
不进行reshape就会报错。
这里a是3*2的,b是1*3的,行满足,列不满足。满足第二个条件
例2
a=np.array([[1,2],[3,4],[5,6]])
b=np.array([1,2,1]).reshape((3,1))
print(a*b)
[[1 2]
[6 8]
[5 6]]
这里a是3*2,b是3*1,满足第二个条件。
例3
a=np.array([[1],[3],[5]])
b=np.array([1,2,1,2])
print(a+b)
[[2 3 2 3]
[4 5 4 5]
[6 7 6 7]]
这里a被复制了三次,构成4列;b被复制了三次,构成3行。
这个例子中a是3*1的,b是1*4的,输入最大值是3*4。满足第三个条件。
-----------------------------------------------------------------------------------------------------