您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何使用NumPy中的廣播”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何使用NumPy中的廣播”吧!
正常情況下,兩個(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ù)組)。
如果兩個(gè)數(shù)組操作,NumPy會(huì)對(duì)兩個(gè)數(shù)組的對(duì)象進(jìn)行比較,從最后一個(gè)維度開(kāi)始,如果兩個(gè)數(shù)組的維度滿足下面的兩個(gè)條件,我們就認(rèn)為這兩個(gè)數(shù)組是兼容的,可以進(jìn)行運(yùn)算:
維度中的元素個(gè)數(shù)是相同的
其中一個(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)注!
免責(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)容。