目錄
umpy是python機器學習技術棧的基礎,它可以對機器學習中常用的數據結構(向量 vector、矩陣 matrices、張量 tensor) 進行高效的操作。因此,在最開始,我們先要熟悉 numpy 的基礎操作。
1. 向量的基本操作
Numpy的主要數據結構是多維數組。
向量,其實就是一個一維數組,我們可以水平地(行向量)或垂直地(列向量)表示它。numpy的數組索引是從0開始的,可以通過索引或者切片方式訪問元素。
#加載庫
import numpy as np
#創建一個行向量
vector_row=np.array([1,2,3,4,5])
#創建一個列向量
vector_column=np.array([1],[2],[3],[4],[5])
#選擇向量中的一個元素
print(vector_row[2]) # 3
print(vector_column[2]) # [3]
#選取一個向量中的所有元素
print(vector_row[:]) #[1,2,3,4,5]
#向量的切片操作
print(vector_row[:2]) #[1 2]
print(vector_column[:2]) # [[1]
# [2]]
向量 和 的點積定義爲 ,在NumPy中用dot 或 @(python 3.5及以上)實現:
import numpy as np
# 創建向量
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])
# 計算點積
print(np.dot(vector_a, vector_b)) #32
print(vector_a @ vector_b) #32
2. 矩陣的基本操作
2.1 創建矩陣
創建矩陣通常用np.array,然而,對於二維矩陣,numpy提供了專用的數據結構 np.mat 來表示。
np.array與np.mat 的區別在於:
1)np.array更具通用性,np.mat只適用於二維矩陣,維數超過2以後,np.mat就不適用了。
2)np.mat可以從字符串或列表中生成;np.array只能從列表中生成。
a = np.mat('4,3;2,1')
b = np.mat('1 2;3 4')
c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]])
3)np.array生成的數組,用 np.dot() 表示矩陣乘積,* 或 np.multiply() 表示點乘;而np.mat生成數組,* 和 np.dot() 的作用相同,點乘只能用np.multiply()。
4) np.array和np.mat生成的矩陣轉置均可以用 a.T 表示;但是在矩陣求逆操作中,np.array 生成的矩陣一般用 np.linalg.inv(a) ;而np.mat生成的矩陣可以採用 a.I 這樣的簡單形式。
5)np.array和np.mat生成的矩陣可以相互轉換:
np.asmatrix(a)
np.asarray(a)
機器學習中,大多還是使用np.array創建矩陣,主要是因爲數組纔是NumPy的標準數據結構,絕大多數操作都是基於數組的。
2.2 選擇元素
NumPy數組的索引編號是從0開始的,可以通過下標直接訪問向量或矩陣中的元素。此外,NumPy還提供了切片操作。這一塊內容我在前面的博文中已經介紹過了(點此參考),在這裏就不多說了。
2.3 展示屬性
可以使用shape、size、ndim等函數展示一個矩陣的形狀、大小和維數:
import numpy as np
m = np.array([[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]])
print(m.shape) # (3,5)
print(m.size) # 15
print(m.ndim) # 2
2.4 基礎計算
在NumPy中可以使用max、min 查找數組中的最大值或最小值,並通過mean、var 和 std 計算數組的平均值、方差和標準差:
import numpy as np
m = np.array([[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]])
print(np.mean(m)) # 12.0
print(np.var(m)) # 68.66666666666667
print(np.std(m)) # 8.286535263104035
reshape函數可以在不改變元素值的前提下改變一個數組的形狀:
import numpy as np
matrix = np.array([[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23]])
print(matrix.shape) # (3,4)
print(matrix.size) # 12
# reshape(a, b): 將已有數組轉化爲a行b列的數組形式
matrix_1=matrix.reshape(4,3)
print(matrix_1)
# [[ 0 1 2]
# [ 3 10 11]
# [12 13 20]
# [21 22 23]]
matrix_2=matrix.reshape(2,6)
print(matrix_2)
#[[ 0 1 2 3 10 11]
#[12 13 20 21 22 23]]
# reshape中能傳入參數值-1,只需指定行數或列數
matrix_3=matrix.reshape(6,-1) #表示只指定行數爲6,列數根據自動生成
print(matrix_3)
# [[ 0 1]
# [ 2 3]
# [10 11]
# [12 13]
# [20 21]
# [22 23]]
可以用 flatten() 展開一個矩陣,也就是將多維數組轉換成一個一維數組,該功能也可以用 matrix.reshape(1,-1) 實現。
matrix_4 = matrix.flatten()
print(matrix_4)
#[ 0 1 2 3 10 11 12 13 20 21 22 23]
通過NumPy還可以非常方便的計算矩陣的秩(np.linalg.matrix_rank)、計算行列式(np.linalg.det)、獲取矩陣的對角線元素(diagonal())、計算矩陣的跡(trace())、計算特徵值和特徵向量(np.linalg.eig)等:
import numpy as np
matrix=np.array([[1,1,1],[1,1,10],[1,1,15]])
#計算矩陣的秩
print(np.linalg.matrix_rank(matrix)) # 2
#計算行列式
print(np.linalg.det(matrix)) #0.0
#獲取對角線元素
print(matrix.diagonal()) #[ 1 1 15]
#獲取對角線向上偏移量爲1的對角線元素
print(matrix.diagonal(offset=1)) #[ 1 10]
#獲取對角線向下偏移量爲1的對角線元素
print(matrix.diagonal(offset=-1)) #[1 1]
#計算矩陣的跡(對角線元素之和)
print(matrix.trace()) #17
print(sum(matrix.diagonal())) #17
#計算特徵值和特徵向量
eig_values,eig_vectors=np.linalg.eig(matrix)
print(eig_values)
#[1.57972598e+01 1.20274024e+00 4.17207245e-17]
print(eig_vectors)
# [[ 9.35154454e-02 9.54818342e-01 7.07106781e-01]
# [ 5.61805577e-01 2.83317939e-01 -7.07106781e-01]
# [ 8.21966761e-01 -8.97378394e-02 -4.99981379e-17]]
PS,矩陣的奇異值分解採用np.linalg.svd(matrix),想了解特徵值分解和奇異值分解的童鞋可以點擊這裏,同時也可以查看我之前的博文。
向量或矩陣的轉置和方陣的求逆運算可以通過下面的命令非常便捷地實現:
#轉置
matrix.T
#方陣的逆
np.linalg.inv(matrix)
矩陣間的運算包括矩陣的相加、相減和矩陣的乘法:
import numpy as np
# 創建矩陣
matrix_A = np.array([[1, 2], [3, 4]])
matrix_B = np.array([[5, 6], [7, 8]])
#矩陣相加(np.add)
print(np.add(matrix_A,matrix_B))
# [[ 6 8]
# [10 12]]
#矩陣相減(np.subtract)
print(np.subtract(matrix_A,matrix_B))
# [[-4 -4]
# [-4 -4]]
# 矩陣相乘(np.dot或@)
print(np.dot(matrix_A, matrix_B))
print(matrix_A @ matrix_B)
# [[19 22]
# [43 50]]
# 兩個矩陣對應元素相乘(*)
print(matrix_A * matrix_B)
# [[ 5 12]
# [21 32]]
關於矩陣的基礎計算就講到這裏了~
參考:
- 《python機器學習手冊》,Chris Albon著
- https://www.jianshu.com/p/fab721cb5cb1
- https://www.cnblogs.com/cymwill/p/9937850.html