日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python求矩阵的秩_Python--线性代数篇

發布時間:2024/3/13 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python求矩阵的秩_Python--线性代数篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

講解Python在線性代數中的應用,包括:

一、矩陣創建

先導入Numpy模塊,在下文中均采用np代替numpy

1 import numpy as np

矩陣創建有兩種方法,一是使用np.mat函數或者np.matrix函數,二是使用數組代替矩陣,實際上官方文檔建議我們使用二維數組代替矩陣來進行矩陣運算;因為二維數組用得較多,而且基本可取代矩陣。

1 >>> a = np.mat([[1, 2, 3], [4, 5, 6]]) #使用mat函數創建一個2X3矩陣

2 >>>a3 matrix([[1, 2, 3],4 [4, 5, 6]])5 >>> b = np.matrix([[1, 2, 3], [4, 5, 6]])#np.mat和np.matrix等價

6 >>>b7 matrix([[1, 2, 3],8 [4, 5, 6]])9 >>> a.shape #使用shape屬性可以獲取矩陣的大小

10 (2, 3)

1 >>> c = np.array([[1, 2, 3], [4, 5, 6]]) #使用二維數組代替矩陣,常見的操作通用

2 >>> c#注意c是array類型,而a是matrix類型

3 array([[1, 2, 3],4 [4, 5, 6]])

單位陣的創建

1 >>> I = np.eye(3)2 >>>I3 array([[ 1., 0., 0.],4 [ 0., 1., 0.],5 [ 0., 0., 1.]])

矩陣元素的存取操作:

1 >>> a[0]#獲取矩陣的某一行

2 matrix([[1, 2, 3]])3 >>> a[:, 0].reshape(-1, 1)#獲取矩陣的某一列

4 matrix([[1],5 [4]])6 >>> a[0, 1]#獲取矩陣某個元素

7 2

二、矩陣乘法和加法

矩陣類型,在滿足乘法規則的條件下可以直接相乘

1 >>> A = np.mat([[1, 2, 3], [3, 4, 5], [6, 7, 8]])#使用mat函數

2 >>> B = np.mat([[5, 4, 2], [1, 7, 9], [0, 4, 5]])3 >>> A #注意A, B都是matrix類型,可以使用乘號,如果是array則不可以直接使用乘號

4 matrix([[1, 2, 3],5 [3, 4, 5],6 [6, 7, 8]])7 >>>B8 matrix([[5, 4, 2],9 [1, 7, 9],10 [0, 4, 5]])11 >>> A * B#學過線性代數的都知道:A * B != B * A

12 matrix([[ 7, 30, 35],13 [ 19, 60, 67],14 [ 37, 105, 115]])15 >>> B *A16 matrix([[ 29, 40, 51],17 [ 76, 93, 110],18 [ 42, 51, 60]])

如果是使用數組代替矩陣進行運算則不可以直接使用乘號,應使用dot()函數。dot函數用于矩陣乘法,對于二維數組,它計算的是矩陣乘積,對于一維數組,它計算的是內積。

1 >>> C = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])2 >>> D = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])3 >>> C #C, D都是array類型,不能直接使用乘號,應該使用dot()函數

4 array([[1, 2, 3],5 [3, 4, 5],6 [6, 7, 8]])7 >>>D8 array([[5, 4, 2],9 [1, 7, 9],10 [0, 4, 5]])11 #>>> C * D, Error, 注意這不是矩陣乘法!!!

12 >>> np.dot(C, D)#正確的寫法,得到的結果和上一段代碼的第11行的結果的一樣的。

13 array([[ 7, 30, 35],14 [ 19, 60, 67],15 [ 37, 105, 115]])

如何理解對于一維數組,它計算的是內積???

注意:在線性代數里面講的維數和數組的維數不同,如線代中提到的n維行向量在Python中是一維數組,而線代中的n維列向量在Python中是一個shape為(n, 1)的二維數組!

第16行,第18行:F是一維數組,G是二維數組,維數不同,個人認為相乘沒有意義,但是16行沒有錯誤,18行報錯。關于dot()的乘法規則見:NumPy-快速處理數據--矩陣運算

1 >>> E = np.array([1, 2, 3])2 >>> F = np.array([4, 3, 9])3 >>> E.shape#E,F都是一維數組

4 (3,)5 >>>np.dot(E, F)6 37

7 >>>np.dot(F, E)8 37

9 >>> G = np.array([4, 3, 9]).reshape(-1, 1)10 >>>G11 array([[4],12 [3],13 [9]])14 >>> G.shape

15 (3, 1)16 >>> np.dot(F, G)#因此dot(F, G)不再是內積,而是一個只有一個元素的數組

17 array([106])18 >>> np.dot(G, F)#ValueError: shapes (3,1) and (3,) not aligned: 1 (dim 1) != 3 (dim 0)

19 >>> E.shape = (1, -1)#把E改為二維數組

20 >>>E21 array([[1, 2, 3]])22 >>>E.shape23 (1, 3)24 >>> np.dot(G, E)#3×1的G向量乘以1×3的E向量會得到3×3的矩陣

25 array([[ 4, 8, 12],26 [ 3, 6, 9],27 [ 9, 18, 27]])

矩陣的加法運算

1 >>> A + B#矩陣的加法對matrix類型和array類型是通用的

2 matrix([[ 6, 6, 5],3 [ 4, 11, 14],4 [ 6, 11, 13]])5 >>> C +D6 array([[ 6, 6, 5],7 [ 4, 11, 14],8 [ 6, 11, 13]])

矩陣的數乘運算

1 >>> 2 * A#矩陣的數乘對matrix類型和array類型是通用的

2 matrix([[ 2, 4, 6],3 [ 6, 8, 10],4 [12, 14, 16]])5 >>> 2 *C6 array([[ 2, 4, 6],7 [ 6, 8, 10],8 [12, 14, 16]])

三、矩陣的轉置

1 >>> A = np.array([[1, 2, 3], [3, 4, 5], [6, 7, 8]])2 >>> B = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])3 >>>A4 array([[1, 2, 3],5 [3, 4, 5],6 [6, 7, 8]])7 >>> A.T #A的轉置

8 array([[1, 3, 6],9 [2, 4, 7],10 [3, 5, 8]])11 >>> A.T.T#A的轉置的轉置還是A本身

12 array([[1, 2, 3],13 [3, 4, 5],14 [6, 7, 8]])

驗證矩陣轉置的性質:(A±B)'=A'±B'

1 >>> (A +B).T2 array([[ 6, 4, 6],3 [ 6, 11, 11],4 [ 5, 14, 13]])5 >>> A.T +B.T6 array([[ 6, 4, 6],7 [ 6, 11, 11],8 [ 5, 14, 13]])

驗證矩陣轉置的性質:(KA)'=KA'

1 >>> 10 *(A.T)2 array([[10, 30, 60],3 [20, 40, 70],4 [30, 50, 80]])5 >>> (10 *A).T6 array([[10, 30, 60],7 [20, 40, 70],8 [30, 50, 80]])

驗證矩陣轉置的性質:(A×B)'= B'×A'

1 >>>np.dot(A, B).T2 array([[ 7, 19, 37],3 [ 30, 60, 105],4 [ 35, 67, 115]])5 >>>np.dot(B.T, A.T)6 array([[ 7, 19, 37],7 [ 30, 60, 105],8 [ 35, 67, 115]])

四、方陣的跡

方陣的跡就是主對角元素之和,使用trace()函數獲得方陣的跡:

1 >>>A2 array([[1, 2, 3],3 [3, 4, 5],4 [6, 7, 8]])5 >>>B6 array([[5, 4, 2],7 [1, 7, 9],8 [0, 4, 5]])9 >>> np.trace(A) #A的跡等于A.T的跡

10 13

11 >>>np.trace(A.T)12 13

13 >>> np.trace(A+B)#和的跡 等于 跡的和

14 30

15 >>> np.trace(A) +np.trace(B)16 30

五、計算行列式

1 >>>A2 array([[1, 2],3 [1, 3]])4 >>>np.linalg.det(A)5 1.0

六、逆矩陣/伴隨矩陣

若A存在逆矩陣(滿足det(A) != 0,或者A滿秩),使用linalg.inv求得方陣A的逆矩陣

1 importnumpy as np2 >>> A = np.array([[1, -2, 1], [0, 2, -1], [1, 1, -2]])3 >>>A4 array([[ 1, -2, 1],5 [ 0, 2, -1],6 [ 1, 1, -2]])7 >>> A_det = np.linalg.det(A) #求A的行列式,不為零則存在逆矩陣

8 >>>A_det9 -3.0000000000000004

10 >>> A_inverse = np.linalg.inv(A) #求A的逆矩陣

11 >>>A_inverse12 array([[ 1. , 1. , 0. ],13 [ 0.33333333, 1. , -0.33333333],14 [ 0.66666667, 1. , -0.66666667]])15 >>> np.dot(A, A_inverse) #A與其逆矩陣的乘積為單位陣

16 array([[ 1., 0., 0.],17 [ 0., 1., 0.],18 [ 0., 0., 1.]])19 >>> A_companion = A_inverse * A_det #求A的伴隨矩陣

20 >>>A_companion21 array([[-3., -3., -0.],22 [-1., -3., 1.],23 [-2., -3., 2.]])

七、解一元線性方程

使用np.linalg.solve()解一元線性方程組,待解方程為:

x + 2y + z = 72x- y + 3z = 73x+ y + 2z =18

1 >>> importnumpy as np2 >>> A = np.array([[1, 2, 1], [2, -1, 3], [3, 1, 2]])3 >>> A #系數矩陣

4 array([[ 1, 2, 1],5 [ 2, -1, 3],6 [ 3, 1, 2]])7 >>> B = np.array([7, 7, 18])8 >>>B9 array([ 7, 7, 18])10 >>> x =np.linalg.solve(A, B)11 >>>x12 array([ 7., 1., -2.])13 >>> np.dot(A, x)#檢驗正確性,結果為B

14 array([ 7., 7., 18.])

使用np.allclose()檢測兩個矩陣是否相同:

1 >>> np.allclose(np.dot(A, x), B)#檢驗正確性

2 True

使用?help(np.allclose)?查看?allclose()?的用法:

allclose(a, b, rtol=1e-05, atol=1e-08)

Parameters----------a, b : array_like

Input arrays to compare.

rtol : float

The relative tolerance parameter (see Notes).

atol : float

The absolute tolerance parameter (see Notes).

Returns-------allclose : bool

Returns Trueifthe two arrays are equal within the given

tolerance; False otherwise.

八、計算矩陣距離

矩陣的距離,這里是的是歐幾里得距離,其他距離表示方法我們以后再談,這里說一下如何計算兩個形狀相同矩陣之間的距離。

1 >>> A = np.array([[0, 1], [1, 0]])#先創建兩個矩陣

2 >>> B = np.array([[1, 1], [1, 1]])3 >>> C = A - B #計算距離矩陣C

4 >>>C5 array([[-1, 0],6 [ 0, -1]])7 >>> D = np.dot(C, C)#距離矩陣的平方

8 >>> E = np.trace(D) #計算矩陣D的跡

9 >>>E10 2

11 >>> E ** 0.5 #將E開平方得到距離

12 1.4142135623730951

關于計算矩陣距離我也不理解。網上看的帖子,先記下來

九、矩陣的秩

numpy包中的linalg.matrix_rank方法計算矩陣的秩:

1 >>> importnumpy as np2 >>> I = np.eye(3)#先創建一個單位陣

3 >>>I4 array([[ 1., 0., 0.],5 [ 0., 1., 0.],6 [ 0., 0., 1.]])7 >>> np.linalg.matrix_rank(I)#秩

8 3

9 >>> I[1, 1] = 0#將該元素置為0

10 >>>I11 array([[ 1., 0., 0.],12 [ 0., 0., 0.],13 [ 0., 0., 1.]])14 >>> np.linalg.matrix_rank(I)#此時秩變成2

15 2

十、求方陣的特征值特征向量

1 >>> importnumpy as np2 >>> x = np.diag((1, 2, 3))#創建一個對角矩陣!

3 >>>x4 array([[1, 0, 0],5 [0, 2, 0],6 [0, 0, 3]])7 >>> a,b = np.linalg.eig(x)#特征值保存在a中,特征向量保存在b中

8 >>>a9 array([ 1., 2., 3.])10 >>>b11 array([[ 1., 0., 0.],12 [ 0., 1., 0.],13 [ 0., 0., 1.]])

根據公式?Ax = λx?檢驗特征值與特征向量是否正確:

1 for i in range(3):#方法一

2 if np.allclose(np.dot(a[i], b[:, i]), x[:, i]):#np.allclose()方法在第七節提到過

3 print 'Right'

4 else:5 print 'Error'

6

7 for i in range(3):#方法二

8 if (np.dot(a[i], b[:, i]) ==x[:, i]).all():9 print 'Right'

10 else:11 print 'Error'

注意,如果寫成?if np.dot(a[i], b[:, i]) == x[:, i]:?是錯誤的:(矩陣包含有多個值,應該使用a.any()或者a.all()判斷)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

十一、判斷正定矩陣

設M是n階方陣,如果對任何非零向量z,都有z'Mz> 0,其中z'?表示z的轉置,就稱M正定矩陣。

判定定理1:對稱陣A為正定的充分必要條件是:A的特征值全為正。

判定定理2:對稱陣A為正定的充分必要條件是:A的各階順序主子式都為正。

判定定理3:任意陣A為正定的充分必要條件是:A合同于單位陣。

下面用定理1判斷對稱陣是否為正定陣

1 >>> importnumpy as np2 >>> A = np.arange(16).reshape(4, 4)3 >>>A4 array([[ 0, 1, 2, 3],5 [ 4, 5, 6, 7],6 [ 8, 9, 10, 11],7 [12, 13, 14, 15]])8 >>> A = A + A.T #將方陣轉換成對稱陣

9 >>>A10 array([[ 0, 5, 10, 15],11 [ 5, 10, 15, 20],12 [10, 15, 20, 25],13 [15, 20, 25, 30]])14 >>> B = np.linalg.eigvals(A)#求B的特征值,注意:eig()是求特征值特征向量

15 >>>B16 array([ 6.74165739e+01 +0.00000000e+00j,17 -7.41657387e+00 +0.00000000e+00j,18 2.04219701e-15 +3.94306094e-15j,19 2.04219701e-15 -3.94306094e-15j])20

21 if np.all(B>0): #判斷是不是所有的特征值都大于0,用到了all函數,顯然對稱陣A不是正定的

22 print 'Yes'

創建一個對角元素都為正的對角陣,它一定是正定的:

1 >>> A = np.diag((1, 2, 3))#創建對角陣,其特征值都為正

2 >>> B = np.linalg.eigvals(A)#求特征值

3 >>>B4 array([ 1., 2., 3.])5 >>> if np.all(B>0):#判斷特征值是否都大于0

6 print 'Yes'

網上查到更簡便的方法是對對稱陣進行cholesky分解,如果像這樣沒有提示出錯,就說明它是正定的。如果提示出錯,就說明它不是正定矩陣,你可以使用try函數捕獲錯誤值:

1 #-*- coding: utf-8 -*-

2 importnumpy as np3

4 A = np.arange(16).reshape(4, 4)5 A = A +A.T6 printA7 try:8 B =np.linalg.cholesky(A)9 except:10 print ('不是正定矩陣,不能進行cholesky分解。')

當不能進行cholesky分解時,出現的異常是:?LinAlgError: Matrix is not positive definite?,但是但是LinAlgError不是Python標準異常,因此不能使用這條語句。

1 exceptLinAlgError as reason:2 print ('不是正定矩陣,不能進行cholesky分解。\n出錯原因是:' + str(reason))

總結

以上是生活随笔為你收集整理的python求矩阵的秩_Python--线性代数篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色咪咪网站| 亚洲国产精品一 | 性色免费视频 | 国产高清免费av | 免费激情片 | 五月激情婷婷丁香 | 老司机av影院 | 久久亚洲热 | 色撸撸在线 | 欧美高清一区二区三区四区 | 天堂在线观看av | 性高潮免费视频 | 999精品免费视频 | 夜夜春很很躁夜夜躁 | 精品少妇人妻av免费久久久 | 色综合天天干 | 亚洲最大的成人网站 | 黄色片免费在线播放 | 国产又粗又长又黄的视频 | 尤物网在线 | 日本不卡在线视频 | 久久香蕉精品视频 | 五月婷婷七月丁香 | 特级av| 黄视频在线免费看 | 操色网| 主人性调教le百合sm | 超碰日本 | 99九九视频| 四虎网站 | 麻豆国产一区二区三区 | 成人国产三级 | 国内精品久久久久久久影视简单 | 日本少妇xxxx动漫 | 专干中国老太婆hd | 波多野吉衣一区二区 | 国产精品va在线观看无码 | 国产又粗又猛又爽又黄的网站 | 精品少妇一区二区三区 | 嫩草国产精品 | 最新国产露脸在线观看 | 无码人妻丰满熟妇区五十路 | 91精品又粗又猛又爽 | 亚洲一区二区福利 | 一级黄色a级片 | 少妇熟女视频一区二区三区 | 一区在线播放 | 亚洲熟妇一区二区三区 | 天天射天天干天天舔 | 人妻av一区二区三区 | 天天搞天天搞 | 99re这里只有精品6 | 麻豆chinese新婚xxx | 日韩av三区 | 日本孕妇孕交 | 免费黄视频在线观看 | 欧美另类视频在线观看 | 少妇太爽了在线观看 | 波多野结衣视频在线播放 | 天天躁夜夜躁av天天爽 | 亚洲视频999 | 国产精品天美传媒 | 视频区小说区 | 视频一区二区三区在线 | 欧美一级一区 | 天天拍夜夜拍 | 日本不卡中文字幕 | xxx视频网站 | 亚洲欧洲综合网 | 好屌妞视频这里只有精品 | 午夜中文字幕 | 91污片| wwwav视频 | 欧美日韩一区二区不卡 | 亚洲日本视频 | 婷婷影音 | www.国产三级| 丰满人妻一区二区三区46 | 欲求不满在线小早川怜子 | 99爱在线 | 你懂的在线免费观看 | 6080成人| 91日韩欧美 | 国产网站视频 | 秋霞啪啪片 | 中文字幕在线免费看 | 亚洲天堂区 | 欧美大白bbbb与bbbb | 日本女人黄色片 | 男人的天堂视频网站 | 青青在线 | 久久久夜夜 | 色丁香六月 | 亚洲三区在线播放 | 久久综合色视频 | 特级西西444www高清大胆 | 激情综合网婷婷 | 成人在线精品 | 毛片免费在线观看视频 |