广播,就是Numpy对不同维度数组之间可以进行数值计算的方式
广播是Numpy数组独有的功能,列表、元组等其他普通数据类型不具备此功能
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a * b 的结果就是数组 a 与数组 b 对应位相乘,它们直接可以做相应的运算,这要求数组的维数相同,且各维度的长度相同
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
res = a * b
print(res) # [ 10 40 90 160]
当运算中的2个数组的形状不同时,Numpy将自动触发广播机制(对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度)
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([0,1,2])
'''
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
'''
print(a + b)
4 x 3的二维数组a与1 x 3的一维数组b相加,本质上可以理解为数组b在纵向上向下拓展3次(将第一行重复 3 次),从而生成与数组a相同形状的数组,之后再与数组a进行运算
1.一维数组和标量直接运算,然后一维数组的每一个元素都与该标量做差,最后得到的结果还是一个一维数组
import numpy as np
boradcast = np.array([1,2,3,4,5])
scalar = 1
boradcast - scalar # array([0, 1, 2, 3, 4])
2.当一个二维数组与一个一维数组进行运算时,一维数组以其自身规模大小为单位在二维数组上进行传播
import numpy as np
boradcast2 = np.array([[1,2,3,4,5],
[6,7,8,9,10]])
boradcast1 = np.array([1,2,3,4,5])
'''
array([[0, 0, 0, 0, 0],
[5, 5, 5, 5, 5]])
'''
boradcast2 - boradcast1
3.当一个三维数组与一个标量进行运算时,标量以其自身规模大小为单位在三维数组上传播,于是最后的结果就是三维数组的每个元素都减1
import numpy as np
boradcast3 = np.array([[[1,2,3,4,5],[6,7,8,9,10]],
[[11,12,13,14,15],[16,17,18,19,20]]])
scalar = 1
'''
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]])
'''
boradcast3 - scalar
4.当一个三维数组与一个二维数组进行运算时,二维数组以其自身规模大小为单位在三维数组上传播,于是最后的结果就是该三维数组下的两个二维数组与进行广播的这个二维数组做差
import numpy as np
boradcast2 = np.array([[1,2,3,4,5],
[6,7,8,9,10]])
boradcast3 = np.array([[[1,2,3,4,5],[6,7,8,9,10]],
[[11,12,13,14,15],[16,17,18,19,20]]])
'''
array([[[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]],
[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]]])
'''
boradcast3 - boradcast2