numpy
的廣播計算是指在多維陣列上進行的一種高效計算方式,
它可以將計算任務分配到每個維度上,并且可以在計算程序中進行資料共享和同步,從而提高計算效率和精度,
廣播計算在數值計算、科學計算、機器學習等領域都有廣泛的應用,
例如,在數值計算中,廣播計算可以用于求解大規模的非線性方程組;在科學計算中,廣播計算可以用于模擬和預測自然現象;在機器學習中,廣播計算可以用于分布式訓練和推理等場景,
numpy
中廣播計算遵循3個嚴格的規則:
- 如果兩個陣列的維度數不相同,小維度陣列的形狀將會在最左邊補
1
- 如果兩個陣列的形狀在任何一個維度上都不匹配,那么陣列的形狀會沿著維度為
1
的維度擴展以匹配另一個陣列的形狀 - 如果兩個陣列的形狀在任何一個維度上都不匹配并且沒有任何一個維度等于
1
,那么會引發例外
廣播規則一
比如一維陣列和數字運算:
import numpy as np
arr = np.random.randint(1, 10, 5)
print(arr)
#運行結果
[9 8 2 9 7]
print(arr + 1)
#運行結果
[10 9 3 10 8]
print(arr * 2)
#運行結果
[18 16 4 18 14]
arr+1
時,1
被自動擴充成[1, 1, 1, 1, 1]
,和 arr
一樣結構的陣列,
arr*2
時,同樣,2
被自動擴充成[2, 2, 2, 2, 2]
,和 arr
一樣結構的陣列,
二維陣列和一維陣列運算時:
arr1 = np.random.randint(1, 10, (3, 3))
print(arr1)
#運行結果
[[4 4 3]
[8 2 1]
[5 6 5]]
arr2 = np.random.randint(1, 10, 3)
print(arr2)
#運行結果
[3 9 2]
print(arr1 + arr2)
#運行結果
[[ 7 13 5]
[11 11 3]
[ 8 15 7]]
這種情況下,arr2
和arr1
一樣,都是3
列,只是行數不一樣,所以被自動擴展成:
[[3 9 2]
[3 9 2]
[3 9 2]]
然后再和arr1
對應的位置進行加法運算,
廣播規則二
規則二兩個陣列每個維度上的數量都不一樣,比如如下兩個二維陣列的運算:
arr1 = np.random.randint(1, 10, (1, 3))
print(arr1)
#運行結果
[[6 6 7]]
arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#運行結果
[[7]
[6]
[2]]
print(arr1 + arr2)
#運行結果
[[13 13 14]
[12 12 13]
[ 8 8 9]]
arr1
是1
行3
列的陣列,所以arr1
自動擴充了行,保持和arr2
一致:
[[6 6 7]
[6 6 7]
[6 6 7]]
arr2
是3
行1
列的陣列,所以arr2
自動擴充了列,保持和arr1
一致:
[[7 7 7]
[6 6 6]
[2 2 2]]
然后 arr1+arr2
得出了上面的結果,
廣播規則三
規則三也是兩個維度不一樣的陣列,只不過在不一樣的那個維度上,它們的維度數都不是1
,
比如:
arr1 = np.random.randint(1, 10, (2, 3))
print(arr1)
#運行結果
[[7 9 3]
[1 8 7]]
arr2 = np.random.randint(1, 10, (3, 1))
print(arr2)
#運行結果
[[8]
[6]
[7]]
print(arr1 + arr2)
#運行結果
#ValueError: operands could not be broadcast together with shapes (2,3) (3,1)
arr1
是2
行3
列的陣列,arr2
是3
行1
列的陣列,
運算時,arr2
是可以擴充成3
列的,但是arr1
無法擴充成3
行,因為arr1
行的維度和arr2
雖然不一樣但不等于1
,
總結回顧
numpy
的廣播計算雖然簡單,但是對我們的資料分析卻很有意義:
- 提高計算效率:廣播計算可以將計算任務分配到每個維度上,從而減少計算時間,提高計算效率,
- 減少記憶體占用:廣播計算可以在多個維度上同時進行計算,從而減少需要存盤的資料量,減少記憶體占用,
- 支持并行計算:
numpy
的廣播計算可以支持多執行緒和多GPU并行計算,從而提高計算速度, - 易于并發編程:
numpy
的廣播計算提供了一種并發編程的方式,可以方便地實作多執行緒和多GPU并行計算,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556205.html
標籤:Python
上一篇:Servlet p3 HttpServletRequest物件
下一篇:返回列表