利用python進行矩陣運算實例代碼
一、矩陣相乘
python中矩陣相乘可以使用numpy實現,也可以使用sympy實現,以numpy實現為例,代碼如下:
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]])
也可將乘積轉換為分數形式,示例代碼如下:
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為小數形式
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為分數形式
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實現,代碼如下:
import numpy as np
from fractions import Fraction
#numpy實現
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)#分數形式
array([[Fraction(1, 4), Fraction(0, 1)],
[Fraction(-3, 16), Fraction(1, 4)]], dtype=object)
#sympy實現
a04=Matrix([[4,0],[3,4]])
print(a04)
Matrix([
[4, 0],
[3, 4]])
print(a04.inv())
Matrix([
[ 1/4, 0],
[-3/16, 1/4]])
從求解結果分析,sympy會自動給出結果的簡潔形式,如果是分數則用分數表示,在展示效果上優(yōu)于numpy。
三、矩陣特征值與特征向量求解
分別使用numpy和sympy實現,代碼如下:
import numpy as np
from sympy import Matrix
#numpy實現
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實現
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,個數為1個,-1: 2意為特征值為-1,個數為2個
print(a02.eigenvects())
[(-1, 2, [Matrix([
[0],
[0],
[1]])]), (3, 1, [Matrix([
[1],
[2],
[1]])])]
從求解結果看,sympy的求解結果比numpy求解結果更為直觀。
四、矩陣約當標準型與轉換矩陣求解
矩陣約當標準型與轉換矩陣使用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為轉換矩陣,j_mat為約當標準型 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求解的約當標準型的1放在上三角,有些數學教材中將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可以解參數矩陣非奇異時的方程組,也可以解參數矩陣奇異時的方程組,并且給出通解。
總結
到此這篇關于利用python進行矩陣運算的文章就介紹到這了,更多相關python矩陣運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
pytorch.range()和pytorch.arange()的區(qū)別及說明
這篇文章主要介紹了pytorch.range()和pytorch.arange()的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Pandas中Series的創(chuàng)建及數據類型轉換
這篇文章主要介紹了Pandas中Series的創(chuàng)建及數據類型轉換,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
python numpy和list查詢其中某個數的個數及定位方法
今天小編就為大家分享一篇python numpy和list查詢其中某個數的個數及定位方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python爬蟲selenium驗證之中文識別點選+圖片驗證碼案例(最新推薦)
本文介紹了如何使用Python和Selenium結合ddddocr庫實現圖片驗證碼的識別和點擊功能,感興趣的朋友一起看看吧2025-02-02

