广播
NumPy 里有个处理数组的特别方法:广播,意思是将“比较小的数组内容,广播到比较大的数组中”,产生互相兼容的尺寸形状,NumPy 的广播实际使用 C 语言运作,可以有效的运用内存和运算,进一步提高程序运作的效率,这篇教学将会介绍 NumPy 广播的用法。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
广播单一数字
如果是单一个数字,只要单纯透过数学运算式,就能广播为同样大小的数组,其运作的原理是将原本数组的所有元素,根据数学运算式加减乘除广播的数字,产生新的数组。
import numpy as np
a = np.array([1,2,3,4]) # 1x4 陣列
b = 2 # 廣播單一數字 2
print(a+b) # [3 4 5 6]
print(a-b) # [-1 0 1 2]
print(a*b) # [2 4 6 8]
print(a%b) # [1 0 1 0]
c = np.array([[1,2,3],[4,5,6]]) # 2x3 陣列
print(c+b) # [[3 4 5] [6 7 8]]
print(c-b) # [[-1 0 1] [ 2 3 4]]
print(c*b) # [[ 2 4 6] [ 8 10 12]]
print(c%b) # [[1 0 1] [0 1 0]]
广播数组
如果要将某个数组广播到另外一个数组,同样能单纯透过数学运算式进行计算后广播,但必须注意在“同一个轴 ( 维度 )”上的数量必须相等或等于 1,不然广播时会发生错误。
import numpy as np
a = np.array([[1,1,1],[2,2,2]]) # 2x3 陣列
b = np.array([1,2,3]) # 1x3 陣列
print(a+b) # [[2 3 4] [3 4 5]]
print(a-b) # [[ 0 -1 -2] [ 1 0 -1]]
print(a*b) # [[1 2 3] [2 4 6]]
print(a%b) # [[0 1 1] [0 0 2]]
c = np.array([[1,1,1],[2,2,2],[3,3,3]]) # 3x3 陣列
d = np.array([[1],[2],[3]]) # 3x1 陣列
print(c+d) # [[2 2 2] [4 4 4] [6 6 6]]
print(c-d) # [[0 0 0] [0 0 0] [0 0 0]]
print(c*d) # [[1 1 1] [4 4 4] [9 9 9]]
print(c%d) # [[0 0 0] [0 0 0] [0 0 0]]
如果是同样尺寸的数组,广播就是将同位置的元素,互相进行数学计算,就能得到最终结果。
import numpy as np
a = np.array([[1,1,1],[2,2,2]]) # 2x3 陣列
b = np.array([[3,3,3],[4,4,4]]) # 2x3 陣列
print(a+b) # [[4 4 4] [6 6 6]]
print(a-b) # [[-2 -2 -2] [-2 -2 -2]]
print(a*b) # [[3 3 3] [8 8 8]]
print(a%b) # [[1 1 1] [2 2 2]]
微信扫码关注
抖音扫码关注