一文帶你理解NumPy中的Broadcasting廣播機(jī)制

      網(wǎng)友投稿 817 2025-03-31

      文章目錄

      前言

      官方文檔

      廣播機(jī)制概述

      廣播機(jī)制規(guī)則

      總結(jié)

      前言

      在吳恩達(dá)老師的深度學(xué)習(xí)專項(xiàng)課程中,老師有提到Numpy中的廣播機(jī)制,同時(shí)那一周的測(cè)驗(yàn)也有涉及到廣播機(jī)制的題目。那么,到底什么是Numpy中的廣播機(jī)制?

      官方文檔

      接下來(lái)到了看官方文檔的時(shí)間。

      Array Broadcasting in Numpy

      廣播機(jī)制概述

      讓我們探索numpy中一個(gè)更高級(jí)的概念,這個(gè)概念被稱為廣播。 廣播展現(xiàn)了NumPy在算術(shù)運(yùn)算期間是如何處理具有不同形狀的數(shù)組的。 受到某些約束,較小的陣列將在較大的陣列上“廣播”,以使它們具有相同形狀。 廣播提供了一種數(shù)組矢量化操作,從而使得循環(huán)在C而不是Python中發(fā)生。 它無(wú)需復(fù)制不必要的數(shù)據(jù)即可完成,并且通常算法的效率還挺高。 當(dāng)然在某些情況下,廣播并不是一個(gè)好辦法,因?yàn)樗鼤?huì)導(dǎo)致內(nèi)存使用效率低,從而減慢計(jì)算速度。 本文通過(guò)示例,對(duì)廣播進(jìn)行了詳盡的介紹。 它還提供何時(shí)使用廣播的提示。

      numpy操作通常是逐個(gè)元素完成的,這就需要兩個(gè)數(shù)組具有完全相同的形狀

      Example 1

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

      1

      2

      3

      4

      5

      當(dāng)數(shù)組的形狀滿足某些條件時(shí),numpy的廣播規(guī)則將放寬這種數(shù)組限制。 將數(shù)組和標(biāo)量值在一起運(yùn)算時(shí),會(huì)出現(xiàn)最簡(jiǎn)單的廣播示例:

      Example 2

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

      1

      2

      3

      4

      5

      盡管只有一個(gè)變量是數(shù)組,但是結(jié)果和之前的一個(gè)代碼例子是一樣的。 我們可以認(rèn)為其中的標(biāo)量在算術(shù)運(yùn)算中被拓展成與數(shù)組a變量形狀相同的數(shù)組。 例如下圖中顯示的中拓展的新元素只是原始標(biāo)量的副本。這種拓展只是概念上的。 numpy的明智之處在于使用原始標(biāo)量值而不必要?jiǎng)?chuàng)建副本,從而使廣播操作盡可能地節(jié)省內(nèi)存提高計(jì)算效率。 由于上面的代碼例子中,乘法過(guò)程中標(biāo)量移動(dòng)的內(nèi)存較少,所以在具有一百萬(wàn)個(gè)元素?cái)?shù)組的Windows 2000上,廣播機(jī)制與之前的兩個(gè)數(shù)組相加相比大概快10%。

      在最簡(jiǎn)單的廣播示例中,標(biāo)量b被拉伸為與a相同形狀的數(shù)組,使得這些形狀適用于逐元素乘法。

      下面的規(guī)則決定了兩個(gè)具有兼容形狀的數(shù)組是否可以在單個(gè)代碼段中進(jìn)行廣播。

      廣播機(jī)制規(guī)則

      廣播規(guī)則

      為了廣播,操作中兩個(gè)陣列的尾軸的大小必須相同,或者其中一個(gè)必須是一個(gè)。

      問(wèn)題來(lái)了,尾軸是什么?

      為此我找到了python - numpy broadcasting - explanation of trailing axes - Stack Overflow這篇解答。

      If you have two arrays with different dimensions number, say one 1x2x3 and other 2x3, then you compare only the trailing common dimensions, in this case 2x3. But if both your arrays are two-dimensional, then their corresponding sizes have to be either equal or one of them has to be 1.

      In your case you have a 2x2 and 4x2 and 4 != 2 and neither 4 or 2 equals 1, so this doesn’t work.

      假設(shè)你有兩個(gè)不同維度的數(shù)組。一個(gè)是1x2x3,另一個(gè)是2x3,那么只需要比較后面的公共尺寸,在這種情況下為2x3。 但是,**如果兩個(gè)數(shù)組都是二維的,則它們的對(duì)應(yīng)大小必須相等或其中之一必須為1 **。

      在兩個(gè)二維數(shù)組中2x2和4x2,4!= 2,并且4或2都不等于1,所以廣播行不通的。

      這個(gè)解釋?xiě)?yīng)該比較清楚了。

      如果不滿足此條件,則會(huì)引發(fā)異常,提示數(shù)組的形狀不兼容。 廣播操作創(chuàng)建的結(jié)果數(shù)組的大小是兩個(gè)數(shù)組中每個(gè)維度的最大大小。 請(qǐng)注意,該規(guī)則并未說(shuō)明需要具有相同維數(shù)的兩個(gè)數(shù)組。 如果有一個(gè)256 x 256 x 3的RGB值數(shù)組,想要按不同的值縮放圖像中的每種顏色,則可以將圖像乘以具有3個(gè)值的一維數(shù)組。

      在下面的示例中,兩個(gè)數(shù)組都具有長(zhǎng)度為1的軸,這些軸在廣播操作中被擴(kuò)展為更大的大小。

      下面,是幾個(gè)代碼例子和圖形表示,有助于使廣播規(guī)則直觀明了。例3將一個(gè)一維數(shù)組添加到一個(gè)二維數(shù)組。

      Example 3

      >>> from numpy import array >>> a = array([[ 0.0, 0.0, 0.0], ... [10.0, 10.0, 10.0], ... [20.0, 20.0, 20.0], ... [30.0, 30.0, 30.0]]) >>> b = array([1.0, 2.0, 3.0]) >>> a + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      如下圖2所示,b將拓展維度大小和a一樣。在圖3中,當(dāng)b的列維度大于a的時(shí),由于形狀不兼容而引發(fā)異常。

      Figure 2

      如果一維數(shù)組元素的數(shù)量與二維數(shù)組列的數(shù)量匹配,則將二維數(shù)組乘以一維數(shù)組將導(dǎo)致廣播。

      當(dāng)數(shù)組的尾部不相等時(shí),廣播將失敗,因?yàn)闊o(wú)法將第一個(gè)數(shù)組的行中的值與第二個(gè)數(shù)組的元素對(duì)齊進(jìn)行逐元素加法。

      Figure 3

      廣播提供了一種獲取兩個(gè)數(shù)組的外部乘積(或任何其他外部操作)的便捷方法。 下面的示例顯示兩個(gè)1維數(shù)組的外部加法運(yùn)算,其結(jié)果與示例3相同。

      Example 4

      >>> from numpy import array, newaxis >>> a = array([0.0, 10.0, 20.0, 30.0]) >>> b = array([1.0, 2.0, 3.0]) >>> a[:,newaxis] + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])

      1

      2

      3

      4

      5

      6

      7

      8

      一文帶你理解NumPy中的Broadcasting廣播機(jī)制

      在這里,newaxis索引運(yùn)算符將一個(gè)新軸插入,使其成為二維4x1數(shù)組。 圖4說(shuō)明了兩個(gè)陣列的拉伸以產(chǎn)生所需的4x3輸出陣列。

      在這里例子里是b = array([1.0, 2.0, 3.0]),但是下圖中是0,1,2,emmmm…尊重原文吧!

      Figure 4.

      在某些情況下,廣播會(huì)拉伸兩個(gè)陣列以形成一個(gè)比任何一個(gè)初始陣列都大的輸出陣列。

      總結(jié)

      以上是對(duì)官方文檔的翻譯,總的來(lái)說(shuō)廣播機(jī)制主要是以下幾點(diǎn):

      效率較快,性能較好

      廣播時(shí),操作中兩個(gè)數(shù)組的尾軸的大小必須相同,或者其中之一必須是1

      如果兩個(gè)數(shù)組都是二維的,則它們的對(duì)應(yīng)大小必須相等或其中之一必須為1

      通過(guò)這篇文章,你是否了解了NumPy的廣播機(jī)制呢?如果了解了請(qǐng)加關(guān)注,若有疑惑不解歡迎留言。每一個(gè)評(píng)論都會(huì)認(rèn)真看的!

      Numpy 數(shù)據(jù)結(jié)構(gòu)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:鴻蒙內(nèi)核M核源碼分析系列十六 MPU內(nèi)存保護(hù)單元
      下一篇:生產(chǎn)制造成本控制(制造企業(yè)成本控制)
      相關(guān)文章
      日韩亚洲国产综合久久久| 亚洲精品无码午夜福利中文字幕 | 国产亚洲精品美女2020久久| 亚洲av无码无在线观看红杏| 亚洲国产综合久久天堂| 亚洲人成自拍网站在线观看| 97久久精品亚洲中文字幕无码| 久久久无码精品亚洲日韩蜜桃 | 亚洲不卡视频在线观看| 中文字幕亚洲第一在线| 亚洲av无码乱码国产精品| 亚洲AV无码专区在线播放中文 | 亚洲国产成人精品无码一区二区 | 亚洲性无码一区二区三区| 在线精品亚洲一区二区| 亚洲综合久久精品无码色欲| 亚洲精品乱码久久久久久V| 亚洲成在人线在线播放无码| 亚洲国产欧美国产综合一区| 亚洲aⅴ无码专区在线观看| 国产亚洲精品美女| 中文字幕亚洲一区| 亚洲国产另类久久久精品| 亚洲最新永久在线观看| 91亚洲国产成人久久精品网址| 在线亚洲高清揄拍自拍一品区| 国产AV无码专区亚洲AV麻豆丫| 日产国产精品亚洲系列| 亚洲日产韩国一二三四区| 亚洲精品线在线观看| 亚洲人成免费电影| 国产精品亚洲AV三区| 久久亚洲高清综合| 亚洲2022国产成人精品无码区| 亚洲成a人片在线网站| 亚洲日韩国产欧美一区二区三区| 国产亚洲视频在线播放大全| 国产成人高清亚洲| 亚洲成人中文字幕| 国产成人精品日本亚洲专| 国产精品亚洲а∨天堂2021|