這篇文章的目的就是讓你完全搞懂軸和廣播!數組
先說軸!spa
軸是什麼?軸就是維度!有幾個軸就是有幾個維度!第幾個軸就是第幾個維度!3d
軸的概念要清楚!數值是0維的,沒有軸;數組是1維的,有1個軸,爲0軸(即行);矩陣是2維的,有2個軸,爲0軸(即行)和1軸(即列);張量是3維的,有3個軸,爲0軸(即通道數)、1軸(即高)和2軸(即寬)。blog
注意注意注意!張量的0軸是通道數!你寫一個張量,而後取它的shape,獲得的第一個元素是通道數!ast
好的,軸懂了,下面說廣播!原理
廣播在numpy和tensorflow裏都有!可是內容和原理是同樣的!因此學一個就好了!那咱們就說numpy的!tensorflow
用書中的話來介紹廣播的規則:兩個數組之間廣播的規則:若是兩個數組的後緣維度(即從末尾開始算起的維度)的軸長度相等或其中一方的長度爲1,則認爲他們是廣播兼容的,廣播會在缺失和(或)長度爲1的維度上進行。擴展
是否是聽不懂!是否是想罵街!怎麼就非得說的這麼官方!說明白點會死是嗎!numpy
那我就告訴你,這句話究竟是啥!im
首先告訴你啥是廣播!
廣播(Broadcast)是 numpy 對不一樣形狀(shape)的數組進行數值計算的方式, 對數組的算術運算一般在相應的元素上進行。
看見沒!算術運算在相應的元素上進行!這是重點!不管加減乘除,都是對應元素進行!因此在廣播裏哪怕是矩陣相乘,也是對應元素相乘!
若是兩個數組 a 和 b 形狀相同,即知足 a.shape == b.shape,那麼 a*b 的結果就是 a 與 b 數組對應位相乘。這要求維數相同,且各維度的長度相同。
當運算中的 2 個數組的形狀不一樣時,numpy 將自動觸發廣播機制。如:
明明是兩個尺寸不一樣的數組,怎麼就能加上了呢!這就是廣播!
第一個圖,咱們看到a是矩陣,二維的,shape是(4,3);而b是向量,一維的,shape是(3)。能夠看到最後一個維度,就是最後一個軸是相等的,都是3!這就是上面說的【兩個數組的後緣維度(即從末尾開始算起的維度)的軸長度相等】!因而廣播便把這個shape=(3)的數組擴展成shape=(4,3)的數組!這就是上面說的【廣播會在缺失的維度上進行】!缺失哪了?缺失了那個4啊!由於一個是二維的一個是一維的,一維的那個相比於二維的那個缺乏了0軸啊!因此就在缺失的這個0軸上擴展,這才擴展成了(4,3)啊!
第二個圖,咱們看到a是矩陣,二維的,shape是(4,3);而b是向量,一維的,shape是(1)。能夠看到b的維度是1!知足【兩個數組的後緣維度(即從末尾開始算起的維度)的其中一方的長度爲1】!因而廣播便把這個shape=(1)的數組擴展成shape=(4,3)的數組!這就是上面說的【廣播會在長度爲1的維度上進行】!
第三個圖,咱們看到a是矩陣,二維的,shape是(4,1);而b是向量,一維的,shape是(2)。能夠看到a的最後一個維度是1!知足【兩個數組的後緣維度(即從末尾開始算起的維度)的其中一方的長度爲1】!因而廣播便把這個shape=(4,1)的數組擴展成shape=(4,2)的數組!這就是上面說的【廣播會在長度爲1的維度上進行】!而後就造成了第一個圖的樣子!再像第一個圖那樣操做一遍就好了!固然這個操做不用你管,只要觸發了廣播,他就會負責到底幫你解決這個問題!
怎麼擴展?直接複製!看這個圖:
咔咔咔把b的1行擴展成了4行,這樣就能加了吧!懂了吧!廣播就是這樣!
這是豎着擴展!觸類旁通!橫着擴展也能夠吧!
還有一點,你要注意,就是下圖的狀況!
怎麼明明知足【兩個數組的後緣維度(即從末尾開始算起的維度)的軸長度相等或其中一方的長度爲1】卻不能擴展呢!沒有爲何!由於這樣的無法擴展,你擴展個試試?因此你能夠把這個條件理解爲:要麼這倆數組尺寸都相等,要麼這倆數組有一個數組少一個維度且這倆數組最後一個軸的值相等,要麼這倆數組有一個少一個維度且這倆數組有一個數組的某個維度的值爲1,要麼這倆數組……反正只要能像上面那樣,按列擴展成一致的shape,或者按行擴展成一致的shape,或者二者結合擴展成一致的shape的,就能夠廣播!