【每天幾分鐘,從零入門python編程的世界!】
這節課我們學習numpy中的數據的一個多變的特性--broadcasting,broadcasting的官方的說明比較麻煩,我們這裡把它簡化一下,就把它當做「腦補」的意思。
我們舉例來說明。
例:
運行結果:
從上例中,我們看到,x的「形狀」是3行2列,y的「形狀」是1行2列,之前我們學習numpy中的四則運算,所舉的例子中,兩個數組都是相同的「形狀」,在相加的時候每個數組對應位置上的元素分別相加,形成新的數組。而在這個例子中,x和y「形狀」不相同,y沒有第二行和第三行,但是我們看到代碼運行結果,相當於如下的代碼:
運行結果是一樣的:
這就是broadcasting,就相當於把y的第二行、第三行「腦補」上跟第一行一樣的元素,從而讓x和y的「形狀」相同,都變成3行2列,然後再進行對位運算,這就是broadcasting。
●什麼是broadcasting?
根據上例,我們發現沒有什麼複雜的原理,我們只要知道numpy中兩個「形狀」不同的數組進行加減乘除運算時,會「腦補」成相同的形狀再進行運算,這種運算的方法就叫broadcasting。
●numpy.empty_like
我們可以用numpy.empty_like(x)生成一個跟x數組形狀一樣的新的數組。
例:
運行結果:
通過上面的代碼,我們用np.empty_like(x)生成了一個數組,保存在z中,當我們把x和z列印出來,看到結果是一樣的。
除了np.empty_like(x),還有np.ones_like(x)、np.zeros_like(x)等等,它們也是分別生成跟x「形狀」一樣的數組,但是前者每個元素都是1,後者每個元素都是0。知道有這樣的東西就行。
●用numpy.empty_like實現broadcast
例:
運行結果:
代碼說明:
z[i,:]表示z數組的第i行所有列的元素。
比如z[1,0:2]就表示z數組的第2行的第1列到第2列的元素。逗號前面代表行數,逗號後面代表列數,冒號前後什麼都不寫就代表這一行的所有列的元素。
我們通過np.empty_like以及for循環的方式,把x數組的每一行的元素都加上y數組對應位置上的元素,這個過程就相當於broadcast「腦補」的過程。
我是時問新,歡迎關注我。跟我一起從零開始學習Python,每天花一點時間,開啟python編程新世界的大門,領略新的風光,讓人生多一種可能!