12 广播

8 阅读2分钟

Numpy 里面比较重要的概念广播, 意思是将比较小的数组内容,广播到比较大的数组中,产生相互兼容的尺寸形状,Numpy 的广播实际使用 C语言操作,可以有效的运用记忆和运算,进一步提高程序运行的效率,下面介绍 Numpy 广播的用法。

广播单一数字

如果是单一个数字,只要单纯的通过数学运算算式,就能广播为同样大小的数组,其运作的原理是将原来数组的所有元素,根据数学运算算式加减乘除广播的数字,产生新的数组。

import numpy as np

a = np.array([1,2,3,4])   # 1x4 数组
b = 2                     # 广播单一数字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]]