溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用NumPy中的廣播

發(fā)布時(shí)間:2021-10-11 11:21:28 來(lái)源:億速云 閱讀:97 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“如何使用NumPy中的廣播”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何使用NumPy中的廣播”吧!

基礎(chǔ)廣播

正常情況下,兩個(gè)數(shù)組需要進(jìn)行運(yùn)算,那么每個(gè)數(shù)組的對(duì)象都需要有一個(gè)相對(duì)應(yīng)的值進(jìn)行計(jì)算才可以。比如下面的例子:

a = np.array([1.0, 2.0, 3.0])b = np.array([2.0, 2.0, 2.0])a * b
array([ 2.,  4.,  6.])

但是如果使用Numpy的廣播特性,那么就不必須元素的個(gè)數(shù)準(zhǔn)確對(duì)應(yīng)。

比如,我們可以講一個(gè)數(shù)組乘以常量:

a = np.array([1.0, 2.0, 3.0])
>>> b = 2.0
>>> a * b
array([ 2.,  4.,  6.])

下面的例子和上面的例子是等價(jià)的,Numpy會(huì)自動(dòng)將b進(jìn)行擴(kuò)展。

NumPy足夠聰明,可以使用原始標(biāo)量值而無(wú)需實(shí)際制作副本,從而使廣播操作盡可能地節(jié)省內(nèi)存并提高計(jì)算效率。

第二個(gè)示例中的代碼比第一個(gè)示例中的代碼更有效,因?yàn)閺V播在乘法過(guò)程中移動(dòng)的內(nèi)存更少(b是標(biāo)量而不是數(shù)組)。

廣播規(guī)則

如果兩個(gè)數(shù)組操作,NumPy會(huì)對(duì)兩個(gè)數(shù)組的對(duì)象進(jìn)行比較,從最后一個(gè)維度開(kāi)始,如果兩個(gè)數(shù)組的維度滿足下面的兩個(gè)條件,我們就認(rèn)為這兩個(gè)數(shù)組是兼容的,可以進(jìn)行運(yùn)算:

  1. 維度中的元素個(gè)數(shù)是相同的

  2. 其中一個(gè)維數(shù)是1

如果上面的兩個(gè)條件不滿足的話,就會(huì)拋出異常: ValueError: operands could not be broadcast together。

維度中的元素個(gè)數(shù)是相同的,并不意味著要求兩個(gè)數(shù)組具有相同的維度個(gè)數(shù)。

比如表示顏色的256x256x3 數(shù)組,可以和一個(gè)一維的3個(gè)元素的數(shù)組相乘:

Image  (3d array): 256 x 256 x 3
Scale  (1d array):             3
Result (3d array): 256 x 256 x 3

相乘的時(shí)候,維度中元素個(gè)數(shù)是1的會(huì)被拉伸到和另外一個(gè)維度中的元素個(gè)數(shù)一致:

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

上面的例子中,第二維的1被拉伸到7,第三維的1被拉伸到6,第四維的1被拉伸到5。

還有更多的例子:

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

下面是不匹配的例子:

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

再舉個(gè)實(shí)際代碼的例子:

>>> 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
ValueError: operands could not be broadcast together with shapes (4,) (5,)

>>> 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.]])

廣播還提供了一個(gè)非常方便的進(jìn)行兩個(gè)1維數(shù)組進(jìn)行外部乘積的運(yùn)算:

>>> 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.]])

其中a[:, np.newaxis] 將1維的數(shù)組轉(zhuǎn)換成為4維的數(shù)組:

In [230]: a[:, np.newaxis]Out[230]:array([[ 0.],   [10.],   [20.],   [30.]])

感謝各位的閱讀,以上就是“如何使用NumPy中的廣播”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何使用NumPy中的廣播這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI