原理
两个数组的后缘维度相同,或者在其中一方的维度为1。广播在缺失或者长度为1的维度上补充
举例说明
其中一方维度为1:A为(4,5)的三维数组,B为(4,1)的二维数组,两者维度相同,一个维度相同, 其中另外一个维度的其中一方为1,这种情况是可以进行广播的。
#维度相同,当其中一个维度相同,两个为维度其中一个为1时,可以进行广播
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
print(f'a={a}\n')
b=np.array([[1],[3]])#2*1
print(f'b={b}\n')
c=a+b
print(f'c={c}')
d = a/b
print(f'd={d}')
a.shape= (2,3),b.shape=(2,1),第一个维度相同,第二个维度其中一个为1,可以广播,b被广播成b1,b1.shape=(2,3),此时相当于 c=a+b1;同理d=a/b相当于a/b1
后缘维度:A为(3,4,5)的三维数据,B为(4,5)的二维数组。由于A和B的后缘维度都为(4,5),所以可以进行广播机制。
同理:A为(3,4)的二维数组,B为(4,)的1为数组,他们的后缘维度都是4,所以可以进行广播。
#当A和B的后缘维度相同时,启动广播机制
a=np.array([[[1,2],[2,3],[3,4]],[[2,3],[4,5],[7,8]]])#2*3*2
b=np.array([[6,6],[7,7],[8,8]])#3*2
print(a.shape)
print(b.shape)
c=a+b
print(c)
print(c.shape)#相加后,c的结果是(2,3,2)
a.shape=(2, 3, 2),b.shape = (3, 2),
经常使用的例子
每一行除以每行的均值
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
print(a/a.mean(axis =1,keepdims=1))
解释:keepdims=1使得保持二维,使得返回的每行均值数组如上所示,此时shape = (2,1),不然就是这个,此时的shape=(2,),此时a.shape=(2,3),满足其中一方维度为1的条件,均值被广播成
每一列除以每一列的均值
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
a/a.mean(axis =0)
这边没有keepdims=1,因为a.shape=(2,3),a.mean(axis=0).shape=(3,),,满足后缘维度相同的条件
当然也可以keepdims=1,结果相同
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
a/a.mean(axis =0,keepdims=1)
此时a.shape=(2,3),a.mean(axis =0,keepdims=1).shape=(1,3),满足后缘维度相同的条件
所以建议使用上方两个例子的时候,建议keepdims=1
参考:
python的广播机制(broadcasting)_python中的broadcasting_ningyuanfeng的博客-CSDN博客