Python之Numpy入门实战教程(2):进阶篇之线性代数
Numpy、Pandas、Matplotlib是Python的三個重要科學計算庫,今天整理了Numpy的入門實戰(zhàn)教程。NumPy是使用Python進行科學計算的基礎庫。 NumPy以強大的N維數(shù)組對象為中心,它還包含有用的線性代數(shù),傅里葉變換和隨機數(shù)函數(shù)。
本文主要介紹Numpy庫的重要應用:線性代數(shù),線性代數(shù)在機器學習和深度學習中有著廣泛的應用。
強烈建議大家將本文中的程序運行一遍。這樣能加深對numpy庫的使用。
?
目錄
1)Matrix transpose
2)Matrix dot product
3)Matrix inverse
4)Identity matrix
5)QR decomposition
6)Determinant
7)Eigenvalues and eigenvectors
8)Singular Value Decomposition
9)Diagonal and trace
10)Solving a system of linear scalar equations
Numpy2維數(shù)組在python中可以有效地表示矩陣。 現(xiàn)在我們將快速完成一些主要的矩陣操作。 有關(guān)線性代數(shù),向量和矩陣的更多詳細信息,請參閱線性代數(shù)教程。
1)Matrix transpose
在線性代數(shù)里我們學過轉(zhuǎn)置這個概念,我們看看它的代碼實現(xiàn)。
m1 = np.arange(10).reshape(2,5) m1#輸出 array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])#矩陣轉(zhuǎn)置 m1.T array([[0, 5],[1, 6],[2, 7],[3, 8],[4, 9]])#一維數(shù)組轉(zhuǎn)置 m2 = np.arange(5) m2array([0, 1, 2, 3, 4])m2.T array([0, 1, 2, 3, 4])#我們也可以把一維數(shù)組變成二維數(shù)組 m2r = m2.reshape(1,5) m2rarray([[0, 1, 2, 3, 4]])m2r.T array([[0],[1],[2],[3],[4]])2)Matrix dot product
我們創(chuàng)建兩個矩陣然后進行兩個矩陣的乘積運算。矩陣相乘時我們要注意相乘矩陣的維度數(shù)。
n1 = np.arange(10).reshape(2, 5) n1#輸出 array([[0, 1, 2, 3, 4],[5, 6, 7, 8, 9]])n2 = np.arange(15).reshape(5,3) n2#輸出 array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11],[12, 13, 14]])#矩陣相乘 n1.dot(n2)array([[ 90, 100, 110],[240, 275, 310]])3)Matrix inverse
在numpy.linalg模塊中包含許多常見線性代數(shù)函數(shù),特別是用于計算方陣矩陣逆的inv函數(shù):
import numpy.linalg as linalgm3 = np.array([[1,2,3],[5,7,11],[21,29,31]]) m3#輸出 array([[ 1, 2, 3],[ 5, 7, 11],[21, 29, 31]])linalg.inv(m3) array([[-2.31818182, 0.56818182, 0.02272727],[ 1.72727273, -0.72727273, 0.09090909],[-0.04545455, 0.29545455, -0.06818182]])4)Identity matrix
一個矩陣和它的逆矩陣相乘得到的是單位陣。
#矩陣與自身逆矩陣相乘 m3.dot(linalg.inv(m3))#輸出 array([[ 1.00000000e+00, -1.66533454e-16, 0.00000000e+00],[ 6.31439345e-16, 1.00000000e+00, -1.38777878e-16],[ 5.21110932e-15, -2.38697950e-15, 1.00000000e+00]])#創(chuàng)建3x3單位陣 np.eye(3)array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])5)QR decomposition
在工程問題中,我們經(jīng)常進行矩陣分解,NumPy也提供了矩陣分解函數(shù)。
#矩陣QR分解 q, r = linalg.qr(m3) qarray([[-0.04627448, 0.98786672, 0.14824986],[-0.23137241, 0.13377362, -0.96362411],[-0.97176411, -0.07889213, 0.22237479]])r array([[-21.61018278, -29.89331494, -32.80860727],[ 0. , 0.62427688, 1.9894538 ],[ 0. , 0. , -3.26149699]])q.dot(r) array([[ 1., 2., 3.],[ 5., 7., 11.],[21., 29., 31.]])6)Determinant
我們看看如何計算矩陣的行列式。
linalg.det(m3) 43.999999999999977)Eigenvalues and eigenvectors
我們看看如何計算矩陣的特征值和特征向量。
#計算特征值、特征向量 eigenvalues, eigenvectors = linalg.eig(m3) eigenvalues # λarray([42.26600592, -0.35798416, -2.90802176])eigenvectors # varray([[-0.08381182, -0.76283526, -0.18913107],[-0.3075286 , 0.64133975, -0.6853186 ],[-0.94784057, -0.08225377, 0.70325518]])#驗證 m3.dot(eigenvectors) - eigenvalues * eigenvectors # m3.v - λ*v = 0 array([[ 6.66133815e-15, 1.66533454e-15, -3.10862447e-15],[ 7.10542736e-15, 5.16253706e-15, -5.32907052e-15],[ 3.55271368e-14, 4.94743135e-15, -9.76996262e-15]])8)Singular Value Decomposition
我們來進行矩陣的奇異值分解,這經(jīng)常用來在降低矩陣的運算復雜度。矩陣變得稀疏。
m4 = np.array([[1,0,0,0,2], [0,0,3,0,0], [0,0,0,0,0], [0,2,0,0,0]]) m4array([[1, 0, 0, 0, 2],[0, 0, 3, 0, 0],[0, 0, 0, 0, 0],[0, 2, 0, 0, 0]])U, S_diag, V = linalg.svd(m4) U #輸出 array([[ 0., 1., 0., 0.],[ 1., 0., 0., 0.],[ 0., 0., 0., -1.],[ 0., 0., 1., 0.]])S_diag array([3. , 2.23606798, 2. , 0. ]) #只返回對角線的值#創(chuàng)建返回full維矩陣S_diag S = np.zeros((4, 5)) S[np.diag_indices(4)] = S_diag S # Σ array([[3. , 0. , 0. , 0. , 0. ],[0. , 2.23606798, 0. , 0. , 0. ],[0. , 0. , 2. , 0. , 0. ],[0. , 0. , 0. , 0. , 0. ]])V array([[-0. , 0. , 1. , -0. , 0. ],[ 0.4472136 , 0. , 0. , 0. , 0.89442719],[-0. , 1. , 0. , -0. , 0. ],[ 0. , 0. , 0. , 1. , 0. ],[-0.89442719, 0. , 0. , 0. , 0.4472136 ]])#驗證 U.dot(S).dot(V) # U.Σ.V == m4 array([[1., 0., 0., 0., 2.],[0., 0., 3., 0., 0.],[0., 0., 0., 0., 0.],[0., 2., 0., 0., 0.]])9)Diagonal and trace
我們看看如何返回矩陣的對角線元素和跡。
np.diag(m3) #返回對角線元素 array([ 1, 7, 31])np.trace(m3) #返回矩陣的跡 3910)Solving a system of linear scalar equations
我們現(xiàn)在來求解一個線性方程組。方程組如下:
coeffs = np.array([[2, 6], [5, 3]]) depvars = np.array([6, -9]) solution = linalg.solve(coeffs, depvars) solutionarray([-3., 2.])#檢查解是否正確 coeffs.dot(solution), depvars(array([ 6., -9.]), array([ 6, -9]))#另一種檢查的方法 np.allclose(coeffs.dot(solution), depvars)TrueSummary
現(xiàn)在我們已經(jīng)了解了Numpy庫的基本操作,但還有很多我們部分可供學習。最好的方法還是在實踐中學習Numpy,我們可以參考Numpy的官方文檔來尋找需要的函數(shù)和有用的功能。
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Python之Numpy入门实战教程(2):进阶篇之线性代数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡最低还款额是什么意思 缓解短期还款
- 下一篇: 信用卡最低还款额影响信用吗 缓解经济压力