numpy和tensorflow中的廣播機制


廣播的引出

  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)。

  比如,一個二維數組減去列平均值,來對數組的每一列進行距平化處理:

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維度並不形同,但是它們可以進行相減操作,這就是通過廣播機制來實現的。

 

廣播的原則

         如果兩個數組的后緣維度(trailing dimension,即從末尾開始算起的維度)的軸長度相符,或其中的一方的長度為1,則認為它們是廣播兼容的。廣播會在缺失和(或)長度為1的維度上進行。

這句話乃是理解廣播的核心。廣播主要發生在兩種情況,一種是兩個數組的維數不相等,但是它們的后緣維度的軸長相符,另外一種是有一方的長度為1。

 

數組維度不同,后緣維度的軸長相符

  我們來看一個例子:

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軸進行擴展。

  上面程序當中的廣播如下圖所示:

技術分享圖片

 

同樣的例子還有:

技術分享圖片

  從上面的圖可以看到,(3,4,2)和(4,2)的維度是不相同的,前者為3維,后者為2維。但是它們后緣維度的軸長相同,都為(4,2),所以可以沿着0軸進行廣播。

  同樣,還有一些例子:(4,2,3)和(2,3)是兼容的,(4,2,3)還和(3)是兼容的,后者需要在兩個軸上面進行擴展。

 

數組維度相同,其中有個軸為1

  我們來看下面的例子:

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的廣播機制是一樣的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM