向量化、Python 中的廣播、python _ numpy 向量的說明
1向量化
向量化是非常基礎的去除程式碼中 for 迴圈的藝術,減少執行時間,在python中使用np.dot()進行向量化。
(1)程式碼舉例
import time #為了計算不同方法的使用時間
a=np.random.rand(1000000) #用隨機值建立了一個百萬維度的陣列
b=np.random.rand(1000000) #用隨機值建立了一個百萬維度的陣列
tic=time.time() #記錄當前時間
c=np.dot(a,b) #相當殘差函式裡面的z=wt+b,做向量化
toc=time.time() #記錄執行之後的時間
print(c)
print("Vectorized version:"+str(1000*(toc-tic))+"ms")
#非向量化版本
c=0
tic=time.time() #記錄當前時間
for i in range(1000000): #非向量化的版本
c +=a[i]*b[i]
toc=time.time() #記錄執行之後的時間
print(c)
print("For loop:"+str(1000*(toc-tic))+"ms")
執行結果:
結果分析:非向量化版本(for迴圈)花費了很多的時間,大概是向量化版本(np.dot)花費時間的300倍
2 Python 中的廣播(Broadcasting in Python)
這是一個不同食物(每 100g)中不同營養成分的卡路里含量表格,表格為 3 行 4 列,列表示不同的食物種類,從左至右依次為蘋果,牛肉,雞蛋,土豆。行表示不同的營養成分,從上到下依次為碳水化合物,蛋白質,脂肪
我們現在想要計算不同食物中不同營養成分中的卡路里百分比,假設上圖的表格是一個 3 行 4 列的矩陣A,記為 A3×4,接下來我們要使用 Python 的numpy 庫完成這樣的計算,在 jupyter notebook 中輸入如下程式碼,按 shift+Enter 執行:
import numpy as np
A=np.array([[56.0,0.0,4.4,68.0], #定義矩陣A
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(A)
cal=A.sum(axis=0) #axis=0表示豎直相加,計算矩陣每列的和,若計算每行,則axis=1
print(cal)
percentage=100*A/cal.reshape(1,4) #這時python廣播的一個例子,讓3*4的一個矩陣A除以這個1*4的矩陣,得到每列中某個資料佔這列所有資料之和的百分比,呼叫 .reshape是為了確定正確的列向量和行向量,重塑操作 reshape 是一個常量時間的操作,時間複雜度是O(1),它的呼叫代價極低
print(percentage)
python中的廣播舉例說明:
3 關於 python _ numpy 向量的說明
Python 的特性允許你使用廣播(broadcasting)功能,這是 Python 的 numpy 程式語言庫中最靈活的地方,這既是優點也是缺點,優點的原因在於它們創造出語言的表達性,Python 語言巨大的靈活性使得你僅僅通過一行程式碼就能做很多事情,同時,由於廣播巨大的靈活性,有時候你對於廣播的特點以及廣播的工作原理這些細節不熟悉的話,你可能會產生很細微或者看起來很奇怪的 bug。例如,如果你將一個列向量新增到一個行向量中,你會以為它報出維度不匹配或型別錯誤之類的錯誤,但是實際上你會得到一個行向量和列向量的求和。
(1)舉例說明
首先設a= np. random. randn(5),這樣會生成儲存在陣列a中的 5 個高斯隨機數變數,之後輸出a,從螢幕上可以得知,此時 a的 shape(形狀)是一個(5, )的結構,這在 Python 中被稱作一個一維陣列,它既不是一個行向量也不是一個列向量,通常稱為值為1的陣列
import numpy as np
a=np.random.randn(5) #生成5個隨機高斯變數儲存在陣列a中
print(a)
print(a.shape) #檢視a的形狀,這是Python中秩為1的陣列,它即不是行向量也不是列向量
print(a.T) #a的轉置
print(np.dot(a,a.T)) #求內積
a=np.random.randn(5,1) #把a設定成5行1列的列向量
print(a)
print(a.T) #a的轉置是行向量,即1*5的矩陣
print(np.dot(a,a.T)) #求內積
#寫程式碼時還有一件經常做的事,那就是如果不完全確定一個向量的維度(dimension),可以扔進一個斷言語句(assertion statement),像這樣,去確保在這種情況下是一個(5,1)向量,或者說是一個列向量:
assert(a.ahape==(5,1)) #宣告這是一個5行1列的矩陣
#如果你不小心以一維陣列來執行,你也能夠重新改變陣列維數 a=reshape,表明一個(5,1)陣列或者一個(1,5)陣列,以致於它表現更像列向量或行向量:
a=a.reshape((5,1)) #把a轉換成5*1陣列
#還可以使用keepdims,這是一個開關,確保python輸出的是一個矩陣:
keepdims=True
本文來自部落格園,作者:zhang-X,轉載請註明原文連結:https://www.cnblogs.com/YY-zhang/p/15058010.html