W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
術(shù)語 Broadcasting 描述了在算術(shù)運算中 numpy 如何處理不同形狀的數(shù)組.在受到某些約束的情況下,較小的數(shù)組在較大的數(shù)組上“broadcasting”,以便它們具有兼容的形狀.broadcasting 提供了一種向量化數(shù)組操作的方法,使循環(huán)發(fā)生在 C 而不是 Python 中.這樣做不會造成不必要的數(shù)據(jù)副本,通常會導致高效的算法實現(xiàn).但是,在有些情況下,broadcasting 是一個壞主意,因為它會導致內(nèi)存使用效率低下,從而減慢計算速度.
NumPy 操作通常是在每個元素的基礎上在數(shù)組對上完成的.在最簡單的情況下,兩個數(shù)組必須具有完全相同的形狀,如下例所示:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = np.array([2.0, 2.0, 2.0])
>>> a * b
array([ 2., 4., 6.])
當數(shù)組的形狀滿足一定的約束時,NumPy 的 broadcasting 規(guī)則放松了這個約束.最簡單的 broadcasting 示例是在一個操作中組合一個數(shù)組和一個標量值時發(fā)生的:
>>> a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2., 4., 6.])
這個結(jié)果等同于前面的例子,其中 b 是一個數(shù)組.我們可以認為標量 b 在算術(shù)運算過程中被拉伸成與 a 形狀相同的數(shù)組,b 中的新元素只是原始標量的副本.拉伸的比喻只是概念上的.NumPy 足夠聰明,可以使用原始標量值,而不需要實際制作副本,因此 broadcasting 操作盡可能具有記憶效率和計算效率.
第二個例子中的代碼比第一個例子中的代碼效率更高,因為在乘法(b是一個標量而不是一個數(shù)組)中,廣播移動的內(nèi)存較少.
在兩個數(shù)組上操作時,NumPy 按照元素比較它們的形狀.它從尾隨的維度開始,并朝著前進的方向前進.兩個維度是兼容的:
如果不滿足這些條件, 則會引發(fā)異常,ValueError: frames are not aligned,表明數(shù)組具有不兼容的形狀.結(jié)果數(shù)組的大小是沿輸入數(shù)組的每個維度的最大大小.
數(shù)組不需要有相同數(shù)量的維度.例如,如果您有一個 256x256x3的 RGB 值的數(shù)組,并且您想通過不同的值縮放圖像中的每個顏色,則可以將圖像乘以一個具有3個值的一維數(shù)組.根據(jù) broadcasting 規(guī)則排列這些數(shù)組尾隨軸的大小,表明它們是兼容的:
Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3
當比較的任何一個維度時,使用另一個維度.換句話說,維度為1的維度被拉伸或“復制”以匹配另一維度.
在以下示例中,在 broadcasting 操作期間A,B數(shù)組都具有長度為1的軸,這些軸在廣播操作期間展開為較大的大?。?/p>
A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5
以下是一些例子:
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5
以下是不能 broadcasting 的形狀的示例:
A (1d array): 3
B (1d array): 4 # trailing dimensions do not match
A (2d array): 2 x 1
B (3d array): 8 x 4 x 3 # second from last dimensions mismatched
broadcasting 實踐中的一個例子:
>>> x = np.arange(4)
>>> xx = x.reshape(4,1)
>>> y = np.ones(5)
>>> z = np.ones((3,4))
>>> x.shape
(4,)
>>> y.shape
(5,)
>>> x + y
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be broadcast to a single shape
>>> xx.shape
(4, 1)
>>> y.shape
(5,)
>>> (xx + y).shape
(4, 5)
>>> xx + y
array([[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3.],
[ 4., 4., 4., 4., 4.]])
>>> x.shape
(4,)
>>> z.shape
(3, 4)
>>> (x + z).shape
(3, 4)
>>> x + z
array([[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]])
broadcasting 為兩個數(shù)組的外部產(chǎn)品(或任何其他外部操作)提供了一種方便的方法.以下示例顯示了兩個一維數(shù)組的外部附加操作:
>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[ 1., 2., 3.],
[ 11., 12., 13.],
[ 21., 22., 23.],
[ 31., 32., 33.]])
這里的 newaxis 索引操作符將一個新的軸插入到 a 中,使其成為一個二維 4x1 數(shù)組.將 4x1 數(shù)組與 b 組合在一起,它有形狀(3,),生成一個4x3數(shù)組.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: