網站首頁 編程語言 正文
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
相關推薦
- 2022-04-09 Spring事務管理之開啟聲明式事務
- 2023-04-06 sql?server?2008數據庫不能添加附加文件的解決方法_mssql2008
- 2022-07-10 node支持ES6模塊化練習
- 2022-10-21 React配置多個代理實現數據請求返回問題_React
- 2022-03-17 Android自定View實現滑動驗證效果的代碼_Android
- 2022-05-09 PyTorch手寫數字數據集進行多分類_python
- 2022-08-19 Android實現九宮格抽獎_Android
- 2022-12-12 封裝flutter狀態管理工具示例詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支