機器學習聽課 | Numpy | 03
Numpy的優勢
Numpy介紹
Numpy
(Numerical Python
)是一個開源的Python科學計算庫,用於快速處理任意維度的陣列.
Numpy
支援常見的陣列和矩陣操作.
對於同樣的計算任務,使用numpy
比直接使用python
要簡潔的多.
numpy
使用ndarray
物件來處理多維陣列,該物件是一個快速而靈活的大資料容器.
ndarray介紹
numpy
提供了一個N維陣列型別ndarray
,它描述相同型別的"items"的集合.
用ndarray
儲存上圖資料:
ndarray與python原生list運算效率對比
在下面我們通過一段程式碼執行來體會ndarray
的好處.
import random
import time
import numpy as np
a = []
for i in range(100000000):
a.append(random.random())
# 通過%time魔法方法, 檢視當前行的程式碼執行一次所花費的時間
%time sum1=sum(a)
b=np.array(a)
%time sum2=np.sum(b)
從上面我們可以看到ndarray
的計算速度要快很多,節約了時間.
機器學習的最大特點就是大量的資料運算,如果沒有一個快速的解決方法,那可能現在python
numpy
專門針對針對ndarray
的操作和運算進行了設計,所有陣列的儲存效率和輸入輸出效能遠優於python的巢狀列表,陣列越大,numpy
的優勢就越明顯.
ndarray的優勢
(1) 記憶體塊風格
list
: 分離式儲存(儲存是地址,不是數值),儲存內容多樣化
ndarray
: 一體式儲存,儲存型別必須是一樣的
(2) ndarray
支援並行化運算(向量化運算)
(3) ndarray
底層使用C語言寫的,效率更高,釋放了GIL
N維陣列 -- ndarray
ndarray的屬性
陣列屬性反映了陣列本身固有的資訊.
ndarray的形狀
如何理解二維,三維,四維的資料呢?
二維就是一張Excel表,三維就是多張sheet疊加在一起,四維就是是多個Excel工作簿疊加.
五維後面就不好具象化了...
形狀(2,2,3)
應該如何理解?
從高維到低緯,有2塊,2行,3列.
ndarray的型別
接下來看看numpy
陣列有哪些型別
建立陣列的時候指定型別
np.array(列表,dtype=...)
# 建立指定型別的陣列
注意: 若不指定型別,整數預設為int32
,小數預設float64
python型別 numpy型別
np.int == np.int32
np.float == np.float64
np.str == np.unicode_
np.bool == np.bool
np.object == np.object_
基本操作
生成陣列的方法
生成0和1的陣列
# 生成全1的陣列
np.ones(shape)
np.ones_like(a)
# 生成全0的陣列
np.zeros(shape)
np.zeros(a)
從現有陣列生成
生成方式
np.array(序列) # 深拷貝
np.asarray(序列) # 淺拷貝
a = np.array([[1,2,3],[4,5,6]])
# 從現有的陣列當中建立
a1 = np.array(a)
# 相當於索引的形式,並沒有真正的建立一個新的
a2 = np.asarray(a)
生成固定範圍的陣列
np.linspace(start,stop,num,endpoint)
# 在[start,stop],生成等間隔的num個數
# endpoint: 序列中是否包含stop值,預設為true]
np.arange(strat,stop,step,dtype)
# 類似range()
np.logspace(start,stop,num,base)
# 生成一個指數的序列
# 在[base**start,base**stop]生成等間隔的num個數
生成隨機陣列
使用模組
np.random模組
均勻分佈
np.random.rand(d0,d1,d2..)
# 返回[0.0,1,0)內的一組均勻分佈的數
# d0,d1,d2... 是維度
np.random.uniform(low=0.0,high=1.0,size=None)
# 從一個均勻分佈的[high,low)中隨機取樣
np.random.randint(low,high=None,size=None,dtype="I")
# 從一個均勻分佈中隨機取樣,生成一個整數或N維整數陣列
# 取數範圍: 若high不為None,去[low,high),否則取[0,low)之間的隨機整數.
正態分佈
什麼是正態分佈
正態分佈是一種概率分佈.
正態分佈是具有兩個引數μ
和σ
的連續性隨機變數的分佈, μ
是隨機變數的均值,σ
是隨機變數的標準差.
正態分佈的應用
生活,生產與科學使驗中很多隨機變數的概率分佈都可以近似地用正態分佈來描述.
標準差與方差的意義
可以理解成資料的一個離散程度的衡量
正態分佈的建立方式
np.random.randn(d0,d1,d2...)
# 從標準正態分佈中返回一個或多個樣本值
np.random.normal(loc=0.0,scale=1.0,size=None)
# 返回一個指定正態分佈
# loc: 均值
# scale: 標準差
np.random.standard_normal(size=None)
# 返回一個指定形狀的正態分佈
均勻分佈和正態分佈
通過繪製直方圖來檢視兩者差別
陣列的索引,切片
我們可以模擬生成一組股票的漲跌幅的資料
案例:隨機生成8只股票2周的交易日漲幅資料
8只股票,兩週(10天)的漲跌幅資料,如何獲取?
兩週的交易日數量為:2 X 5 =10
隨機生成漲跌幅在某個正態分佈內,比如均值0,方差1
# 建立符合正態分佈的8只股票10天的漲跌幅資料
stock_change = np.random.normal(0, 1, (8, 10))
stock_change
形狀修改
ndarray.reshape(shape)
# 修改ndarray的形狀,並返回一個新陣列
ndarray.resize(shape)
# 在原陣列上修改ndarray的形狀
ndarray.T
# 轉置
型別修改
ndarray.astype(型別)
# 修改陣列的型別
陣列去重
np.unique(ndarray)
ndarray運算
邏輯運算
ndarray 邏輯運算子 值
例: stock_change > 5
# 進行陣列邏輯運算,返回一個布林陣列
ndarray[ndarray 邏輯運算子 值]
例: stock_change[stock_change > 5] = -10
# 對陣列進行篩選,可以進行賦值的操作
通用判斷函式
np.all(ndarray 邏輯運算子 值)
# 全部滿足要求才返回True
np.any(ndarray 邏輯運算子 值)
# 任一滿足要求就返回True
np.where(三元運算子)
通過使用np.where
能夠進行更加複雜的運算
np.where(陣列邏輯表示式,值1,值2)
例: np.where(tmp>5,1,0)
# 判別式為真,則賦值為1,否則賦值為0
# 邏輯與,邏輯或
np.logical_and(條件1,條件2,...)
np.logical_or(條件1,條件2,...)
統計運算
統計指標
在資料探勘/機器學習領域,統計指標的值也是我們分析問題的一種方式.
常用的指標如下:
np.min(a[, axis, out, keepdims])
Return the minimum of an array or minimum along an axis.
np.max(a[, axis, out, keepdims])
Return the maximum of an array or maximum along an axis.
np.median(a[, axis, out, overwrite_input, keepdims])
Compute the median along the specified axis.
np.mean(a[, axis, dtype, out, keepdims])
Compute the arithmetic mean along the specified axis.
np.std(a[, axis, dtype, out, ddof, keepdims])
Compute the standard deviation along the specified axis.
np.var(a[, axis, dtype, out, ddof, keepdims])
Compute the variance along the specified axis.
np.argmin(a[,axis]) 獲取最小值索引
np.argmax(a[,axis]) 獲取最大值索引
案例: 股票漲跌幅統計運算
在統計的時候,axis
軸的取值並不一定,numpy
中不同的api
軸的值都不一樣.
在這裡,axis=0
代表列,axis=1
代表行.
數學: 矩陣
矩陣和向量
矩陣
矩陣matrix
,和array
的區別是矩陣必須是2維的,但array
可以是多維的.
向量
向量是一種特殊的矩陣,講義中的向量一般都是列向量.
下面展示三維列向量(3*1)
加法和標量乘法
矩陣向量乘法
下面是矩陣乘法必須滿足的性質
矩陣乘法
矩陣乘法:
m×n 矩陣乘以 n×o 矩陣,變成 m×o 矩陣。
舉例:比如說現在有兩個矩陣 A 和 B,那 麼它們的乘積就可以表示為圖中所示的形式
下面是一個矩陣乘法的小練習
矩陣乘法的性質
逆,轉置
矩陣的逆: 如矩陣A是一個m*m的矩陣(方陣),如果有逆矩陣,則:
\(AA^{-1} = A^{-1}A = I\)
矩陣轉置就是\(A^T=B\),也就是矩陣的行列進行互換.
陣列間的運算
場景
資料:
[[80, 86],
[82, 80],
[85, 78],
[90, 90],
[86, 82],
[82, 90],
[78, 80],
[92, 94]]
陣列與數的運算
arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr + 1
arr / 2
# 可以對比python列表的運算,看出區別
a = [1, 2, 3, 4, 5]
a * 3
陣列與陣列的運算
arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])
上面這個能進行運算嗎,結果是不行的!
# 不符合廣播機制,不能進行陣列和陣列的運算
arr1: 2,6
arr2: 2,4
廣播機制
當操作兩個陣列時,numpy
會逐個比較它們的shape
(構成的元組tuple
),只有在下述情況下,兩個陣列才能夠進行陣列與陣列的運算.
(1) 維度相等
(2) 維度為1或沒有
例如:
Image (3d array): 256 x 256 x 3
Scale (1d array): 3
Result (3d array): 256 x 256 x 3
A (4d array): 9 x 1 x 7 x 1
B (3d array): 8 x 1 x 5
Result (4d array): 9 x 8 x 7 x 5
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 1
Result (3d array): 15 x 3 x 5
如果是下面這樣則不匹配
A (1d array): 10
B (1d array): 12
A (2d array): 2 x 1
B (3d array): 8 x 4 x 3
矩陣運算
np.dot(a,b)
# 矩陣a和矩陣b點乘
np.matmul(a,b)
# 矩陣a和矩陣b進行矩陣乘法
np.matmul
和np.dot
的差別
二者都是矩陣乘法.
np.matmul
中禁止矩陣和標量的成啊.
在向量乘向量的內積運算中,np.matmul
和np.dot
沒有差別.