numpy兩個數組的相加、相減以及相乘都是對應元素之間的操做。數組
import numpy as np
x = np.array([[2,2,3],[1,2,3]]) y = np.array([[1,1,3],[2,2,4]]) print(x*y) #numpy當中的數組相乘是對應元素的乘積,與線性代數當中的矩陣相乘不同 輸入結果以下: ‘‘‘ [[ 2 2 9] [ 2 4 12]] ‘‘‘
當兩個數組的形狀並不相同的時候,咱們能夠經過擴展數組的方法來實現相加、相減、相乘等操做,這種機制叫作廣播(broadcasting)。dom
好比,一個二維數組減去列平均值,來對數組的每一列進行距平化處理:code
import numpy as np
arr = np.random.randn(4,3) #shape(4,3) arr_mean = arr.mean(0) #shape(3,) demeaned = arr -arr_mean
很明顯上式arr和arr_mean維度並不形同,可是它們能夠進行相減操做,這就是經過廣播機制來實現的。blog
若是兩個數組的後緣維度(trailing dimension,即從末尾開始算起的維度)的軸長度相符,或其中的一方的長度爲1,則認爲它們是廣播兼容的。廣播會在缺失和(或)長度爲1的維度上進行。圖片
這句話乃是理解廣播的核心。廣播主要發生在兩種狀況,一種是兩個數組的維數不相等,可是它們的後緣維度的軸長相符,另一種是有一方的長度爲1。get
咱們來看一個例子:it
import numpy as np arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3) arr2 = np.array([1, 2, 3]) #arr2.shape = (3,) arr_sum = arr1 + arr2 print(arr_sum) 輸入結果以下: ‘‘‘ [[1 2 3] [2 3 4] [3 4 5] [4 5 6]] ‘‘‘
上例中arr1的shape爲(4,3),arr2的shape爲(3,)。能夠說前者是二維的,然後者是一維的。可是它們的後緣維度相等,arr1的第二維長度爲3,和arr2的維度相同。arr1和arr2的shape並不同,可是它們能夠執行相加操做,這就是經過廣播完成的,在這個例子當中是將arr2沿着0軸進行擴展。io
上面程序當中的廣播以下圖所示:ast
一樣的例子還有:class
從上面的圖能夠看到,(3,4,2)和(4,2)的維度是不相同的,前者爲3維,後者爲2維。可是它們後緣維度的軸長相同,都爲(4,2),因此能夠沿着0軸進行廣播。
一樣,還有一些例子:(4,2,3)和(2,3)是兼容的,(4,2,3)還和(3)是兼容的,後者須要在兩個軸上面進行擴展。
咱們來看下面的例子:
import numpy as np arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3) arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1) arr_sum = arr1 + arr2 print(arr_sum) 輸出結果以下: [[1 1 1] [3 3 3] [5 5 5] [7 7 7]]
arr1的shape爲(4,3),arr2的shape爲(4,1),它們都是二維的,可是第二個數組在1軸上的長度爲1,因此,能夠在1軸上面進行廣播,以下圖所示:
在這種狀況下,兩個數組的維度要保證相等,其中有一個軸的長度爲1,這樣就會沿着長度爲1的軸進行擴展。這樣的例子還有:(4,6)和(1,6) 。(3,5,6)和(1,5,6)、(3,1,6)、(3,5,1),後面三個分別會沿着0軸,1軸,2軸進行廣播。
後話:還有上面兩種結合的狀況,如(3,5,6)和(1,6)是能夠相加的。在TensorFlow當中計算張量的時候也是用廣播機制,而且和numpy的廣播機制是同樣的。