日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

淺談numpy廣播機制_python

作者:紅燒code ? 更新時間: 2023-05-10 編程語言

Broadcast

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

例如:

import numpy as np

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


# 運行結果為array([4,10,18])

最簡單的廣播機制

當一個常數與一個array對象相乘時,這時就會觸發numpy的廣播機制

import numpy as np

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


# 運行結果為array([2,4,6])

或許你把這當作理所應當,但是這就是通過廣播機制來實現的。

稍微復雜的廣播機制

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)

輸出結果是:

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

初學者可能認為這樣的運算會報錯,但是這的確是正確的,原因還是廣播機制

廣播機制到底做了什么

我們觀察上面這個稍顯復雜的例子:

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

如下圖:

一個典型的錯誤案例

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

提示無法進行廣播:

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

一個正確的經典示例

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)

結果:

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

運算過程是:

1不等于2,所以對a的axis=2進行廣播,a變為

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

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

axis=1時3等于3,不進行廣播

axis=0時,2不等于1,所以對b的axis=0進行廣播,b變為:

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

最后a、b的shape變為一樣,運算結果即為:

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

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

一種更便捷的計算方式

注:np.newaxis表示增加一個數據寬度為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

結果:

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

廣播過程:

原文鏈接:https://blog.csdn.net/qq_51352578/article/details/125074264

欄目分類
最近更新