1. 程式人生 > 其它 >向量化、Python 中的廣播、python _ numpy 向量的說明

向量化、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設定成51列的列向量

print(a)

print(a.T) #a的轉置是行向量,即1*5的矩陣

print(np.dot(a,a.T)) #求內積

#寫程式碼時還有一件經常做的事,那就是如果不完全確定一個向量的維度(dimension)可以扔進一個斷言語句(assertion statement)像這樣,去確保在這種情況下是一個(5,1)向量,或者說是一個列向量

assert(a.ahape==(5,1)) #宣告這是一個51列的矩陣

#如果你不小心以一維陣列來執行,你也能夠重新改變陣列維數 a=reshape,表明一個(5,1)陣列或者一個(1,5)陣列,以致於它表現更像列向量或行向量

a=a.reshape((51)) #a轉換成5*1陣列

#還可以使用keepdims,這是一個開關,確保python輸出的是一個矩陣

keepdims=True

本文來自部落格園,作者:zhang-X,轉載請註明原文連結:https://www.cnblogs.com/YY-zhang/p/15058010.html