Python中NumPy的線性代數(shù)子模塊linalg詳解
線性代數(shù)子模塊linalg
NumPy 的線性代數(shù)子模塊(linalg)提供了 20 余個(gè)函數(shù),用于求解行列式、逆矩陣、特征值、特征向量,以及矩陣分解等。
SciPy 的線性代數(shù)子模塊(同樣名為 linalg)更為龐大,提供了超過一百個(gè)函數(shù)。
兩個(gè) linalg 子模塊的同名函數(shù)基本保持了相同的功能,有些函數(shù)可能略有差異。
為了盡可能同時(shí)給出兩個(gè)模塊同名函數(shù)的應(yīng)用示例,本節(jié)的代碼同時(shí)導(dǎo)入兩個(gè)子模塊,一個(gè)命名為 sla,另一個(gè)命名為 nla。
import numpy as np from scipy import linalg as sla from numpy import linalg as nla
1. 計(jì)算矩陣的行列式
行列式在本質(zhì)上可以視為線性變換的伸縮因子,因此行列式是一個(gè)標(biāo)量。如果一個(gè)方陣(行數(shù)和列數(shù)相等的矩陣)的行列式等于 0,則該方陣為奇異矩陣,否則為非奇異矩陣。計(jì)算矩陣的行列式雖然簡單,但手工計(jì)算很容易出錯(cuò),而使用 linalg.det( ) 函數(shù)來計(jì)算則是易如反掌。
m = np.mat('0 1 2; 1 0 3; 4 -3 8') sla.det(m) # scipy.linalg -1.9999999999999982 nla.det(m) # numpy.linalg -2.0
2. 求解逆矩陣
矩陣可逆的條件是非奇異,也就是行列式不等于 0。從數(shù)學(xué)的角度看,矩陣可逆或非奇異是好的屬性,類似函數(shù)的可微、可導(dǎo)。盡管 matrix 對象本身有逆矩陣的屬性,但用 linalg 子模塊求解矩陣的逆,也是非常簡單的。
m = np.mat('0 1 2; 1 0 3; 4 -3 8') m.I # matrix對象的逆矩陣屬性 matrix([[-4.5, 7. , -1.5], [-2. , 4. , -1. ], [ 1.5, -2. , 0.5]]) m*m.I # 矩陣和其逆矩陣的乘積為單位矩陣 matrix([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) sla.inv(m) # scipy.linalg array([[-4.5, 7. , -1.5], [-2. , 4. , -1. ], [ 1.5, -2. , 0.5]]) nla.inv(m) # numpy.linalg matrix([[-4.5, 7. , -1.5], [-2. , 4. , -1. ], [ 1.5, -2. , 0.5]])
3. 計(jì)算特征向量和特征值
對于 n 階矩陣 A,若存在標(biāo)量 λ 和 n 維非零列向量 x,使得 Ax=λx,那么標(biāo)量 λ 就稱為矩陣A 的特征值,向量 x 就稱為矩陣 A 的特征向量。
n 階矩陣存在 n 個(gè)特征值,每個(gè)特征值對應(yīng)一個(gè)特征向量。
A = np.mat('0 1 2; 1 0 3; 4 -3 8') # 生成3階矩陣 sla.eigvals(A) # 返回3個(gè)特征值 array([ 7.96850246+0.j, -0.48548592+0.j, 0.51698346+0.j]) sla.eig(A) # 返回3個(gè)特征值和3個(gè)特征向量組成的元組 (array([ 7.96850246+0.j, -0.48548592+0.j, 0.51698346+0.j]), array([[ 0.26955165, 0.90772191, -0.74373492], [ 0.36874217, 0.24316331, -0.65468206], [ 0.88959042, -0.34192476, 0.13509171]])) nla.eigvals(A) # 返回3個(gè)特征值 array([ 7.96850246, -0.48548592, 0.51698346]) nla.eig(A) # 返回3個(gè)特征值和3個(gè)特征向量組成的元組 (array([ 7.96850246, -0.48548592, 0.51698346]), matrix([[ 0.26955165, 0.90772191, -0.74373492], [ 0.36874217, 0.24316331, -0.65468206], [ 0.88959042, -0.34192476, 0.13509171]]))
4. 矩陣的奇異值分解
特征向量和特征值是矩陣最重要的特征,特征向量表示特征是什么,特征值表示這個(gè)特征有多重要。
特征向量和特征值是通過對矩陣的特征分解獲得的,不過特征分解只適用于方陣。實(shí)際應(yīng)用中,很多矩陣并不是方陣,要想獲取矩陣特征就要使用矩陣的奇異值分解。
對 m×n 階矩陣進(jìn)行奇異值分解,返回一個(gè)三元組:
以左奇異向量為列的矩陣 U,形狀為(m, m) 或 (m, k) ;
按降序排列的奇異值向量 s,形狀為 (k, ),其中 k=min(m, n) ;
以右奇異向量為行的矩陣 V,形狀為 (n, n) 或 (k, n)。
A = np.mat(np.random.randint(0,10,(3,4))) A matrix([[6, 7, 8, 1], [7, 4, 9, 6], [4, 6, 2, 1]]) U, s, V = sla.svd(A) U.shape, s.shape, V.shape ((3, 3), (3,), (4, 4)) U array([[-0.63408037, -0.38759249, -0.66911445], [-0.68934803, 0.67538003, 0.26203265], [-0.35034465, -0.62740249, 0.69543134]]) s array([18.88807714, 5.14426409, 2.40355755]) V array([[-0.53109149, -0.49226941, -0.63412832, -0.27109764], [-0.02089797, -0.73402962, 0.33491192, 0.59042171], [ 0.2501572 , 0.22338451, -0.66724387, 0.66506116], [-0.80927528, 0.41106046, 0.20124835, 0.36824166]]) U, s, V = nla.svd(A) U matrix([[-0.63408037, -0.38759249, -0.66911445], [-0.68934803, 0.67538003, 0.26203265], [-0.35034465, -0.62740249, 0.69543134]]) s array([18.88807714, 5.14426409, 2.40355755]) V matrix([[-0.53109149, -0.49226941, -0.63412832, -0.27109764], [-0.02089797, -0.73402962, 0.33491192, 0.59042171], [ 0.2501572 , 0.22338451, -0.66724387, 0.66506116], [-0.80927528, 0.41106046, 0.20124835, 0.36824166]])
5. 求解線性方程組
求解線性方程組對中學(xué)生來說是一件輕松的事情,但是用代碼來實(shí)現(xiàn)的話,其實(shí)并不容易。
線性代數(shù)子模塊 linalg 提供了一個(gè)通用且高效的解決方案,只要把各個(gè)方程的常數(shù)項(xiàng)寫在等號右邊,提取出系數(shù)數(shù)組和常數(shù)數(shù)組,調(diào)用 linalg.solve( ) 函數(shù)即可一步求解。
對于上面的線性方程組,下面的代碼演示了求解過程。
A = np.array([[1,-2,1],[0,2,-8],[-4,5,9]]) # 系數(shù)數(shù)組 b = np.array([0,8,-9]) #常數(shù)數(shù)組 sla.solve(A, b) # 調(diào)用scipy.linalg的solve()函數(shù),返回x、y、z的方程解 array([29., 16., 3.]) nla.solve(A, b) # 調(diào)用numpy.linalg的solve()函數(shù),返回x、y、z的方程解 array([29., 16., 3.])
到此這篇關(guān)于Python中NumPy的線性代數(shù)子模塊linalg詳解的文章就介紹到這了,更多相關(guān)NumPy的線性代數(shù)子模塊linalg內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動(dòng)態(tài)圖大全
數(shù)據(jù)可視化是通過圖形、圖表、地圖等可視元素將數(shù)據(jù)呈現(xiàn)出來,以便更容易理解、分析和解釋,它是將抽象的數(shù)據(jù)轉(zhuǎn)化為直觀形象的過程,本文給大家介紹了使用Python實(shí)現(xiàn)炫酷的數(shù)據(jù)動(dòng)態(tài)圖大全,需要的朋友可以參考下2024-06-06用Python登錄Gmail并發(fā)送Gmail郵件的教程
這篇文章主要介紹了用Python登錄Gmail并發(fā)送Gmail郵件的教程,利用了Python的SMTP庫,代碼非常簡單,需要的朋友可以參考下2015-04-04Python os模塊中的isfile()和isdir()函數(shù)均返回false問題解決方法
這篇文章主要介紹了Python os模塊中的isfile()和isdir()函數(shù)均返回false問題解決方法,返回false的原因是路徑使用了相對路徑,使用絕對路徑就可以解決這個(gè)問題,需要的朋友可以參考下2015-02-02Python基于數(shù)列實(shí)現(xiàn)購物車程序過程詳解
這篇文章主要介紹了Python基于數(shù)列實(shí)現(xiàn)購物車程序過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06詳解opencv中畫圓circle函數(shù)和橢圓ellipse函數(shù)
這篇文章主要介紹了opencv中畫圓circle函數(shù)和橢圓ellipse函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12基于Python實(shí)現(xiàn)自制CV剪貼板功能
云桌面的win10不能調(diào)出剪貼板,對于CV工程師來說十分不方便,所以這篇文章主要介紹了如何使用Python實(shí)現(xiàn)一個(gè)CV剪貼板,提升常用語句的復(fù)制粘貼效率,感興趣的可以了解下2024-02-02Python開發(fā)時(shí)報(bào)TypeError:?‘int‘?object?is?not?iterable錯(cuò)誤的解決方
Python寫循環(huán)程序的時(shí)候遇到TypeError:'int'object is not iterable,所以下面這篇文章主要給大家介紹了關(guān)于Python開發(fā)時(shí)報(bào)TypeError:'int'?object?is?not?iterable錯(cuò)誤的解決方式,需要的朋友可以參考下2022-06-06