利用python進(jìn)行矩陣運(yùn)算實(shí)例代碼
一、矩陣相乘
python中矩陣相乘可以使用numpy實(shí)現(xiàn),也可以使用sympy實(shí)現(xiàn),以numpy實(shí)現(xiàn)為例,代碼如下:
import numpy as np a01=np.random.randint(10,size=(4,3)) print(a01) array([[6, 4, 9], [1, 4, 8], [8, 0, 0], [5, 6, 8]]) a02=np.random.randint(10,size=(3,4)) print(a02) array([[5, 7, 7, 9], [6, 4, 6, 2], [5, 2, 8, 2]]) a03=np.dot(a01,a02) print(a03) array([[ 99, 76, 138, 80], [ 69, 39, 95, 33], [ 40, 56, 56, 72], [101, 75, 135, 73]])
也可將乘積轉(zhuǎn)換為分?jǐn)?shù)形式,示例代碼如下:
import numpy as np from fractions import Fraction a01=np.random.randint(10,size=(4,3)).astype(float) a01[0,0]=0.5 print(a01) array([[0.5, 4. , 3. ], [0. , 4. , 4. ], [4. , 3. , 6. ], [0. , 2. , 6. ]]) a02=np.random.randint(10,size=(3,4)) print(a02) array([[5, 7, 7, 9], [6, 4, 6, 2], [5, 2, 8, 2]]) a03=np.dot(a01,a02) print(a03)#a03為小數(shù)形式 array([[41.5, 25.5, 51.5, 18.5], [44. , 24. , 56. , 16. ], [68. , 52. , 94. , 54. ], [42. , 20. , 60. , 16. ]]) a04=np.vectorize(lambda x: Fraction.from_float(x).limit_denominator())(a03) print(a04)#a04為分?jǐn)?shù)形式 array([[Fraction(83, 2), Fraction(51, 2), Fraction(103, 2), Fraction(37, 2)], [Fraction(44, 1), Fraction(24, 1), Fraction(56, 1), Fraction(16, 1)], [Fraction(68, 1), Fraction(52, 1), Fraction(94, 1), Fraction(54, 1)], [Fraction(42, 1), Fraction(20, 1), Fraction(60, 1), Fraction(16, 1)]], dtype=object)
二、矩陣求逆
分別使用numpy和sympy實(shí)現(xiàn),代碼如下:
import numpy as np from fractions import Fraction #numpy實(shí)現(xiàn) a01=np.random.randint(5,size=(2,2)) print(a01) array([[4, 0], [3, 4]]) a02 = np.linalg.inv(a01.astype(float))#求逆矩陣 print(a02) array([[ 0.25 , 0. ], [-0.1875, 0.25 ]]) a03=np.vectorize(lambda x: Fraction.from_float(x).limit_denominator())(a02) print(a03)#分?jǐn)?shù)形式 array([[Fraction(1, 4), Fraction(0, 1)], [Fraction(-3, 16), Fraction(1, 4)]], dtype=object) #sympy實(shí)現(xiàn) a04=Matrix([[4,0],[3,4]]) print(a04) Matrix([ [4, 0], [3, 4]]) print(a04.inv()) Matrix([ [ 1/4, 0], [-3/16, 1/4]])
從求解結(jié)果分析,sympy會自動給出結(jié)果的簡潔形式,如果是分?jǐn)?shù)則用分?jǐn)?shù)表示,在展示效果上優(yōu)于numpy。
三、矩陣特征值與特征向量求解
分別使用numpy和sympy實(shí)現(xiàn),代碼如下:
import numpy as np from sympy import Matrix #numpy實(shí)現(xiàn) a01=np.array([[-1,2,0],[0,3,0],[2,1,-1]]) print(a01) array([[-1, 2, 0], [ 0, 3, 0], [ 2, 1, -1]]) eigenvalue, featurevector = np.linalg.eig(a01) print(eigenvalue) array([-1., -1., 3.]) print(featurevector) array([[ 0.00000000e+00, 1.11022302e-16, 4.08248290e-01], [ 0.00000000e+00, 0.00000000e+00, 8.16496581e-01], [ 1.00000000e+00, -1.00000000e+00, 4.08248290e-01]]) #sympy實(shí)現(xiàn) a02=Matrix([[-1,2,0],[0,3,0],[2,1,-1]]) print(a02) Matrix([ [-1, 2, 0], [ 0, 3, 0], [ 2, 1, -1]]) print(a02.eigenvals()) {3: 1, -1: 2}#3: 1意為特征值為3,個數(shù)為1個,-1: 2意為特征值為-1,個數(shù)為2個 print(a02.eigenvects()) [(-1, 2, [Matrix([ [0], [0], [1]])]), (3, 1, [Matrix([ [1], [2], [1]])])]
從求解結(jié)果看,sympy的求解結(jié)果比numpy求解結(jié)果更為直觀。
四、矩陣約當(dāng)標(biāo)準(zhǔn)型與轉(zhuǎn)換矩陣求解
矩陣約當(dāng)標(biāo)準(zhǔn)型與轉(zhuǎn)換矩陣使用numpy求解較為繁瑣,因此使用sympy求解,代碼如下:
from sympy import Matrix a01=Matrix([[-1,2,0],[0,3,0],[2,1,-1]]) print(a01) Matrix([ [-1, 2, 0], [ 0, 3, 0], [ 2, 1, -1]]) p_mat,j_mat=a01.jordan_form()#p_mat為轉(zhuǎn)換矩陣,j_mat為約當(dāng)標(biāo)準(zhǔn)型 print(p_mat) Matrix([ [0, 1, 1], [0, 0, 2], [2, 0, 1]]) print(j_mat) Matrix([ [-1, 1, 0], [ 0, -1, 0], [ 0, 0, 3]])
注意sympy求解的約當(dāng)標(biāo)準(zhǔn)型的1放在上三角,有些數(shù)學(xué)教材中將1放在下三角。
五、矩陣奇異值分解
sympy不直接支持矩陣奇異值的求解,因此使用numpy求解,代碼如下:
import numpy as np a02=np.array([[4,0],[3,0],[0,0]]) print(a02) array([[4, 0], [3, 0], [0, 0]]) U, S, Vt = np.linalg.svd(a02) print(U)#左奇異向量組成的酉矩陣 array([[-0.8, -0.6, 0. ], [-0.6, 0.8, 0. ], [ 0. , 0. , 1. ]]) print(S)#奇異值 array([5., 0.]) print(Vt)#右奇異向量組成的酉矩陣 array([[-1., -0.], [ 0., 1.]])
奇異向量組成的酉矩陣并不唯一。
六、矩陣方程組求解
使用sympy求解,代碼如下:
from sympy import Matrix, symbols, linsolve A = Matrix([[2,3,1],[4,2,3], [7,1,-1]]) print(A) Matrix([ [2, 3, 1], [4, 2, 3], [7, 1, -1]]) B = Matrix([[4],[17],[1]]) print(B) Matrix([ [ 4], [17], [ 1]]) x, y, z = symbols('x y z') result=linsolve((A,B),x,y,z) print(result) {(1, -1, 5)} A = Matrix([[1,1,1,1],[4,3,5,-1], [2,1,3,-3]]) print(A) Matrix([ [1, 1, 1, 1], [4, 3, 5, -1], [2, 1, 3, -3]]) B = Matrix([[-1],[-1],[1]]) print(B) Matrix([ [-1], [-1], [ 1]]) x, y, z = symbols('x y z') result=linsolve((A,B),x,y,z) print(result) {(2 - 2*z, z - 3, z)}
從示例代碼可看出,sympy可以解參數(shù)矩陣非奇異時的方程組,也可以解參數(shù)矩陣奇異時的方程組,并且給出通解。
總結(jié)
到此這篇關(guān)于利用python進(jìn)行矩陣運(yùn)算的文章就介紹到這了,更多相關(guān)python矩陣運(yùn)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)簡易學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡易學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09win10環(huán)境下python3.5安裝步驟圖文教程
本文通過圖文并茂的形式給大家介紹了win10環(huán)境下python3.5安裝步驟,需要的朋友可以參考下2017-02-02python 密碼學(xué)示例——凱撒密碼的實(shí)現(xiàn)
這篇文章主要介紹了python 密碼學(xué)示例——凱撒密碼的實(shí)現(xiàn),幫助大家更好的利用python處理密碼,感興趣的朋友可以了解下2020-09-09Keras存在自定義loss或layer怎樣解決load_model報錯問題
這篇文章主要介紹了Keras存在自定義loss或layer怎樣解決load_model報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Python腳本實(shí)現(xiàn)下載合并SAE日志
這篇文章主要介紹了Python腳本實(shí)現(xiàn)下載合并SAE日志,本文講解了代碼編寫過程,然后給出了完整代碼,需要的朋友可以參考下2015-02-02