ValueError: operands could not be broadcast together with shapes (9,8) (8,9)

在进行矩阵计算的时候遇到的错误,为了方便理解,以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。满足第三个条件。

-----------------------------------------------------------------------------------------------------

这篇也讲的不错 

发布了58 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ThorKing01/article/details/98083598