欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析NumPy中的Broadcasting廣播機(jī)制

 更新時間:2021年05月30日 10:26:32   作者:滄夜2021  
在吳恩達(dá)老師的深度學(xué)習(xí)專項(xiàng)課程中,老師有提到NumPy中的廣播機(jī)制,同時那一周的測驗(yàn)也有涉及到廣播機(jī)制的題目。那么,到底什么是NumPy中的廣播機(jī)制?本文就來介紹一下

前言

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

官方文檔

接下來到了看官方文檔的時間。

Array Broadcasting in Numpy

廣播機(jī)制概述

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

numpy操作通常是逐個元素完成的,這就需要兩個數(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.])

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

Example 2

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

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

Vector-Scalar multiplication

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

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

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

廣播規(guī)則

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

問題來了,尾軸是什么?

為此我找到了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è)你有兩個不同維度的數(shù)組。一個是1x2x3,另一個是2x3,那么只需要比較后面的公共尺寸,在這種情況下為2x3。 但是,**如果兩個數(shù)組都是二維的,則它們的對應(yīng)大小必須相等或其中之一必須為1 **。

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

這個解釋應(yīng)該比較清楚了。

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

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

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

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

下面,是幾個代碼例子和圖形表示,有助于使廣播規(guī)則直觀明了。例3將一個一維數(shù)組添加到一個二維數(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.]])

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

Matrix-Vector

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

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

廣播提供了一種獲取兩個數(shù)組的外部乘積(或任何其他外部操作)的便捷方法。 下面的示例顯示兩個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.]])

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

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

vector-vector with newaxis

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

總結(jié)

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

  • 效率較快,性能較好
  • 廣播時,操作中兩個數(shù)組的尾軸的大小必須相同,或者其中之一必須是1
  • 如果兩個數(shù)組都是二維的,則它們的對應(yīng)大小必須相等或其中之一必須為1

通過這篇文章,你是否了解了NumPy的廣播機(jī)制呢?更多相關(guān)NumPy Broadcasting廣播機(jī)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VSCode Python開發(fā)環(huán)境配置的詳細(xì)步驟

    VSCode Python開發(fā)環(huán)境配置的詳細(xì)步驟

    這篇文章主要介紹了VSCode Python開發(fā)環(huán)境配置的詳細(xì)步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • django 類視圖的使用方法詳解

    django 類視圖的使用方法詳解

    這篇文章主要介紹了django 類視圖的使用方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 詳解Python中的四種隊列

    詳解Python中的四種隊列

    隊列是一種只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。這篇文章主要介紹了Python中的四種隊列,需要的朋友可以參考下
    2018-05-05
  • Django與FastAPI的選擇區(qū)別深入剖析

    Django與FastAPI的選擇區(qū)別深入剖析

    這篇文章主要為大家介紹了Django與FastAPI的選擇區(qū)別深入剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Python實(shí)現(xiàn)多線程下載腳本的示例代碼

    Python實(shí)現(xiàn)多線程下載腳本的示例代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)多線程下載腳本的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python實(shí)戰(zhàn)教程之OCR文字識別方法匯總

    python實(shí)戰(zhàn)教程之OCR文字識別方法匯總

    ocr是一種光學(xué)字符識別技術(shù),簡單來說它能夠識別出圖像中的文字并且將其給取出來,下面這篇文章主要給大家介紹了關(guān)于python實(shí)戰(zhàn)教程之OCR文字識別方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • python2中的中文亂碼

    python2中的中文亂碼

    這篇文章主要介紹了python2中的中文亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python os.rename() 重命名目錄和文件的示例

    Python os.rename() 重命名目錄和文件的示例

    今天小編就為大家分享一篇Python os.rename() 重命名目錄和文件的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python如何發(fā)布自已pip項(xiàng)目的方法步驟

    python如何發(fā)布自已pip項(xiàng)目的方法步驟

    這篇文章主要介紹了python如何發(fā)布自已pip項(xiàng)目的方法步驟,方便大家學(xué)習(xí),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 簡述python&pytorch 隨機(jī)種子的實(shí)現(xiàn)

    簡述python&pytorch 隨機(jī)種子的實(shí)現(xiàn)

    這篇文章主要介紹了簡述python&pytorch 隨機(jī)種子的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論