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

淺談numpy廣播機(jī)制

 更新時(shí)間:2023年02月15日 09:16:19   作者:紅燒code  
本文主要介紹了淺談numpy廣播機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Broadcast

廣播是numpy對(duì)不同形狀(shape)的數(shù)組進(jìn)行數(shù)值計(jì)算的方式,對(duì)數(shù)組的算術(shù)運(yùn)算通常在相應(yīng)的元素上進(jìn)行。如果兩個(gè)數(shù)組a和b形狀相同,即a.shape==b.shape為True時(shí),那么a*b的結(jié)果就是a與b數(shù)組的對(duì)應(yīng)位相乘。這要求維數(shù)相同,并且各維度的長(zhǎng)度相同。

例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(a*b)


# 運(yùn)行結(jié)果為array([4,10,18])

最簡(jiǎn)單的廣播機(jī)制

當(dāng)一個(gè)常數(shù)與一個(gè)array對(duì)象相乘時(shí),這時(shí)就會(huì)觸發(fā)numpy的廣播機(jī)制

import numpy as np

a = np.array([1, 2, 3])
print(a*2)


# 運(yùn)行結(jié)果為array([2,4,6])

或許你把這當(dāng)作理所應(yīng)當(dāng),但是這就是通過(guò)廣播機(jī)制來(lái)實(shí)現(xiàn)的。

稍微復(fù)雜的廣播機(jī)制

import numpy as np
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([1, 2, 3])
print(a+b)

輸出結(jié)果是:

array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23],
       [31, 32, 33]])

初學(xué)者可能認(rèn)為這樣的運(yùn)算會(huì)報(bào)錯(cuò),但是這的確是正確的,原因還是廣播機(jī)制

廣播機(jī)制到底做了什么

我們觀察上面這個(gè)稍顯復(fù)雜的例子:

a.shape=(4,3)b.shape=(1,3),兩個(gè)矩陣axis=1的數(shù)據(jù)寬度是相同的,但是axis=0的數(shù)據(jù)寬度不一樣,并且b.shape[0]=1,這就是廣播機(jī)制的觸發(fā)條件,這時(shí)numpy會(huì)把b沿axis=0的方向復(fù)制4份,即形狀變成(4, 3),與a的一致,接下來(lái)就是對(duì)應(yīng)位相加即可。

如下圖:

一個(gè)典型的錯(cuò)誤案例

import numpy as np
a = np.array([[0, 0, 0],
              [10, 10, 10],
              [20, 20, 20],
              [30, 30, 30]])
b = np.array([0, 1, 2, 3])
a+b

提示無(wú)法進(jìn)行廣播:

能否廣播必須從axis的最大值向最小值看去,依次對(duì)比兩個(gè)要進(jìn)行運(yùn)算的數(shù)組的axis的數(shù)據(jù)寬度是否相等,如果在某一個(gè)axis下,一個(gè)數(shù)據(jù)寬度為1,另一個(gè)數(shù)據(jù)寬度不為1,那么numpy就可以進(jìn)行廣播;但是一旦出現(xiàn)了在某個(gè)axis下兩個(gè)數(shù)據(jù)寬度不相等,并且兩者全不為1的狀況,就無(wú)法廣播。

一個(gè)正確的經(jīng)典示例

import numpy as np
a = np.arange(6).reshape((2, 3, 1))
b = np.arange(6).reshape((1, 3, 2))
print(a)
print(b)
print(a+b)
print((a+b).shape)

結(jié)果:

a是:
array([[[0],
        [1],
        [2]],

       [[3],
        [4],
        [5]]])
        
b是:
array([[[0, 1],
        [2, 3],
        [4, 5]]])
        
a+b是:
array([[[ 0,  1],
        [ 3,  4],
        [ 6,  7]],

       [[ 3,  4],
        [ 6,  7],
        [ 9, 10]]])

運(yùn)算過(guò)程是:

1不等于2,所以對(duì)a的axis=2進(jìn)行廣播,a變?yōu)?/p>

array([[[0,0],
        [1,1],
        [2,2]],

       [[3,3],
        [4,4],
        [5,5]]])

axis=1時(shí)3等于3,不進(jìn)行廣播

axis=0時(shí),2不等于1,所以對(duì)b的axis=0進(jìn)行廣播,b變?yōu)椋?/p>

array([[[0, 1],
        [2, 3],
        [4, 5]],
  
       [[0, 1],
        [2, 3],
        [4, 5]]])

最后a、b的shape變?yōu)橐粯?,運(yùn)算結(jié)果即為:

array([[[ 0,  1],
        [ 3,  4],
        [ 6,  7]],

       [[ 3,  4],
        [ 6,  7],
        [ 9, 10]]])

一種更便捷的計(jì)算方式

注:np.newaxis表示增加一個(gè)數(shù)據(jù)寬度為1的維度

因此a[:, np.newaxis] = array([[0],[10],[20],[30]])

import numpy as np
a = np.array([0, 10, 20, 30])
b = np.array([0, 1, 2])
a[:, np.newaxis]+b

結(jié)果:

array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

廣播過(guò)程:

到此這篇關(guān)于淺談numpy廣播機(jī)制的文章就介紹到這了,更多相關(guān)numpy廣播機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python openvc 裁剪、剪切圖片 提取圖片的行和列

    python openvc 裁剪、剪切圖片 提取圖片的行和列

    這篇文章主要介紹了python openvc 裁剪、剪切圖片 提取圖片的行和列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解python 模擬豆瓣登錄(豆瓣6.0)

    詳解python 模擬豆瓣登錄(豆瓣6.0)

    這篇文章主要介紹了python模擬豆瓣登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 如何利用python實(shí)現(xiàn)Simhash算法

    如何利用python實(shí)現(xiàn)Simhash算法

    這篇文章主要介紹了如何利用python實(shí)現(xiàn)Simhash算法,文章基于python的相關(guān)資料展開Simhash算法的詳細(xì)介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Django 刪除upload_to文件的步驟

    Django 刪除upload_to文件的步驟

    這篇文章主要介紹了Django 刪除upload_to文件的步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • 歸納整理Python中的控制流語(yǔ)句的知識(shí)點(diǎn)

    歸納整理Python中的控制流語(yǔ)句的知識(shí)點(diǎn)

    這篇文章主要?dú)w納整理了Python中的控制流語(yǔ)句的知識(shí)點(diǎn),來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解

    python控制nao機(jī)器人身體動(dòng)作實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了python控制nao機(jī)器人身體動(dòng)作實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • python動(dòng)態(tài)監(jiān)控日志內(nèi)容的示例

    python動(dòng)態(tài)監(jiān)控日志內(nèi)容的示例

    本文介紹如何使用Python動(dòng)態(tài)監(jiān)控程序日志的內(nèi)容,這里的動(dòng)態(tài)指的是日志文件不斷的追加新的日志內(nèi)容,動(dòng)態(tài)監(jiān)控是指監(jiān)控日志新追加的日志內(nèi)容
    2014-02-02
  • python先序遍歷二叉樹問(wèn)題

    python先序遍歷二叉樹問(wèn)題

    這篇文章主要介紹了python先序遍歷二叉樹問(wèn)題,簡(jiǎn)單分析了問(wèn)題,然后向大家分享了代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 深入理解Python 關(guān)于supper 的 用法和原理

    深入理解Python 關(guān)于supper 的 用法和原理

    這篇文章主要介紹了Python 關(guān)于supper 的 用法和原理分析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-02-02
  • 在PyTorch中Tensor的查找和篩選例子

    在PyTorch中Tensor的查找和篩選例子

    今天小編就為大家分享一篇在PyTorch中Tensor的查找和篩選例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論