详解Numpy的广播机制
廣播
Numpy中有很多強大的功能,廣播便是其中之一。廣播能幫助你對兩個不同維度的數組執行操作。例如:
import numpy as np a = np.array([[0, 1],[2, 3],[4, 5],]) b = np.array([10, 100]) a * b[[ 0, 100],
[ 20, 300],
[ 40, 500]]
不難發現,數組a和b的維度并不一致。為了讓他們進行計算,Numpy會將b數組在第二維度上進行拉伸,這個過程就像把它復制了三次一樣。當這些過程執行完畢之后,再對兩個數組對應位置的元素執行運算操作。
廣播中有這樣一條規則,只有維度為1的方向可以被拉伸(如果一個數組僅有一維,為了將其進行廣播,其他維度均會被置為1)。上述示例中數組b就是一個一維數組,并且b.shape=(2,)。為了將b的維度廣播到二維,使其與數組a保持一致,Numpy會給b數組添加一個值為1的維度。b數組現在每一維的長度為b.shape=(1, 2)。這樣子,新的維度就可以被拉伸三次,從而使b的維度與a的維度保持一致b.shape=(3, 2)。
另外一條規則是Numpy會對廣播的維度進行比對。為了對兩個數組進行計算,任何不一致的維度都必須被拉伸到同樣的值。但是,根據第一條規則,只有維度為1的方向可以被拉伸。這意味著一些維度是不能被廣播的,若對不為1的維度進行廣播,Numpy將報錯。
c數組的形狀為:(2, 3), b數組的形狀為:(2,)
ValueError Traceback (most recent call last)
in
5 b = np.array([10, 100])
6 print(‘c數組的形狀為:{}, b數組的形狀為:{}’.format(c.shape, b.shape))
----> 7 c * b
ValueError: operands could not be broadcast together with shapes (2,3) (2,)
為什么會報錯呢?我們發現其原因是這樣子的:首先,Numpy會給b數組添加一個維度,使其形狀變為b.shape=(1, 2)。此時,b數組和c數組的最后一維大小分別為2和3。然后,Numpy會對這兩個值進行對比并發現其不一致。由于這兩個維度值均不為1(不能對其進行拉伸),此時,Numpy會終止此計算過程并給出報錯。
要想對上例中的數組c和數組b做乘積運算,我們有如下解決方案:指定Numpy在b數組的第二維度上進行廣播。通過使用None來索引第二個維度便可實現此功能。此時,b的形狀會變為b.shape=(2, 1)。這樣子b數組就可以廣播到與c數組同樣的維度。
[[ 0, 10, 20],
[300, 400, 500]]
在tutorial of Numpy broadcasting rules中有對于上述規則的可視化解釋,并提供了許多很好的例子。
github鏈接
https://github.com/wzy6642/numpy-translate
總結
以上是生活随笔為你收集整理的详解Numpy的广播机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy.divide详解
- 下一篇: numpy.mod详解