內(nèi)容索引
In [1]: import numpy as np 1. 矩陣 在NumP中,,矩陣是ndarray的子類,可以由專用的字符串格式來創(chuàng)建,。我們可以使用mat,、matrix、以及bmat函數(shù)來創(chuàng)建矩陣,。 1.1 創(chuàng)建矩陣 mat函數(shù)創(chuàng)建矩陣時(shí),,若輸入已經(jīng)為matrix或ndarray對(duì)象,則不會(huì)為它們創(chuàng)建副本,。因此,,調(diào)用mat函數(shù)和調(diào)用matrix(data, copy=False)等價(jià)。 在創(chuàng)建矩陣的專用字符串中,,矩陣的行與行之間用分號(hào)隔開,,行內(nèi)的元素之間用空格隔開。 In [2]: A = np.mat("1 2 3; 4 5 6; 7 8 9") print"Creation from string:\n", A Creation from string: [[1 2 3] [4 5 6] [7 8 9]] In [3]: # 轉(zhuǎn)置 print"Transpose A :\n", A.T # 逆矩陣 print"Inverse A :\n", A.I Transpose A : [[1 4 7] [2 5 8] [3 6 9]] Inverse A : [[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15] [ 9.00719925e+15 -1.80143985e+16 9.00719925e+15] [ -4.50359963e+15 9.00719925e+15 -4.50359963e+15]] In [4]: # 通過NumPy數(shù)組創(chuàng)建矩陣 print"Creation from array: \n", np.mat(np.arange(9).reshape(3,3)) Creation from array: [[0 1 2] [3 4 5] [6 7 8]] 1.2 從已有矩陣創(chuàng)建新矩陣 我們可以利用一些已有的較小的矩陣來創(chuàng)建一個(gè)新的大矩陣,。用bmat函數(shù)來實(shí)現(xiàn),。 In [5]: A = np.eye(2) print"A:\n", A B = 2 * A print"B:\n", B # 使用字符串創(chuàng)建復(fù)合矩陣 print"Compound matrix:\n", np.bmat("A B") print"Compound matrix:\n", np.bmat("A B; B A") A: [[ 1. 0.] [ 0. 1.]] B: [[ 2. 0.] [ 0. 2.]] Compound matrix: [[ 1. 0. 2. 0.] [ 0. 1. 0. 2.]] Compound matrix: [[ 1. 0. 2. 0.] [ 0. 1. 0. 2.] [ 2. 0. 1. 0.] [ 0. 2. 0. 1.]] 2. 線性代數(shù) 線性代數(shù)是數(shù)學(xué)的一個(gè)重要分支。numpy.linalg模塊包含線性代數(shù)的函數(shù)。使用這個(gè)模塊,,我們可以計(jì)算逆矩陣,、求特征值、解線性方程組以及求解行列式,。 2.1 計(jì)算逆矩陣 使用inv函數(shù)計(jì)算逆矩陣,。 In [6]: A = np.mat("0 1 2; 1 0 3; 4 -3 8") print"A:\n", A inverse = np.linalg.inv(A) print"inverse of A:\n", inverse print"check inverse:\n", inverse * A A: [[ 0 1 2] [ 1 0 3] [ 4 -3 8]] inverse of A: [[-4.5 7. -1.5] [-2. 4. -1. ] [ 1.5 -2. 0.5]] check inverse: [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] 2.2 行列式 行列式是與方陣相關(guān)的一個(gè)標(biāo)量值。對(duì)于一個(gè)n*n的實(shí)數(shù)矩陣,,行列式描述的是一個(gè)線性變換對(duì)“有向體積”所造成的影響,。行列式的值為正,表示保持了空間的定向(順時(shí)針或逆時(shí)針),,為負(fù)表示顛倒空間的定向,。numpy.linalg模塊中的det函數(shù)可以計(jì)算矩陣的行列式。 In [7]: A = np.mat("3 4; 5 6") print"A:\n", A print"Determinant:\n", np.linalg.det(A) A: [[3 4] [5 6]] Determinant: -2.0 2.3 求解線性方程組 矩陣可以對(duì)向量進(jìn)行線性變換,,這對(duì)應(yīng)于數(shù)學(xué)中的線性方程組,。solve函數(shù)可以求解形如Ax = b的線性方程組,其中A是矩陣,,b是一維或二維的數(shù)組,,x是未知變量。 In [8]: A = np.mat("1 -2 1; 0 2 -8; -4 5 9") print"A:\n", A b = np.array([0,8,-9]) print"b:\n", b A: [[ 1 -2 1] [ 0 2 -8] [-4 5 9]] b: [ 0 8 -9] In [9]: x = np.linalg.solve(A, b) print"Solution:\n", x # check print"Check:\n",b == np.dot(A, x) print np.dot(A, x) Solution: [ 29. 16. 3.] Check: [[ True True True]] [[ 0. 8. -9.]] 2.4 特征值和特征向量 特征值(eigenvalue)即方程Ax = ax的根,,是一個(gè)標(biāo)量,。其中,A是一個(gè)二維矩陣,,x是一個(gè)一維向量,。特征向量(eigenvector)是關(guān)于特征值的向量。在numpy.linalg模塊中,,eigvals函數(shù)可以計(jì)算矩陣的特征值,,而eig函數(shù)可以返回一個(gè)包含特征值和對(duì)應(yīng)特征向量的元組。 In [10]: A = np.mat("3 -2; 1 0") print"A:\n", A print"Eigenvalues:\n", np.linalg.eigvals(A) eigenvalues, eigenvectors = np.linalg.eig(A) print"Eigenvalues:\n", eigenvalues print"Eigenvectors:\n", eigenvectors A: [[ 3 -2] [ 1 0]] Eigenvalues: [ 2. 1.] Eigenvalues: [ 2. 1.] Eigenvectors: [[ 0.89442719 0.70710678] [ 0.4472136 0.70710678]] In [11]: # check # 計(jì)算 Ax = ax的左右兩部分的值 for i in range(len(eigenvalues)): print"Left:\n", np.dot(A, eigenvectors[:,i]) print"Right:\n", np.dot(eigenvalues[i], eigenvectors[:,i]) Left: [[ 1.78885438] [ 0.89442719]] Right: [[ 1.78885438] [ 0.89442719]] Left: [[ 0.70710678] [ 0.70710678]] Right: [[ 0.70710678] [ 0.70710678]] 2.5 奇異值分解 SVD(Singular Value Decomposition,,奇異值分解)是一種因子分解運(yùn)算,,將一個(gè)矩陣分解為3個(gè)矩陣的乘積。奇異值分解是特征值分解的一種推廣,。 在numpy.linalg模塊中的svd函數(shù)可以對(duì)矩陣進(jìn)行奇異值分解。該函數(shù)返回3個(gè)矩陣——U,、Sigma和V,,其中U和V是正交矩陣,Sigma包含輸入矩陣的奇異值,。 In [12]: from IPython.display import Latex Latex(r"$M=U \Sigma V^*$") Out[12]: M=UΣV?M=UΣV? *號(hào)表示共軛轉(zhuǎn)置 In [13]: A = np.mat("4 11 14;8 7 -2") print"A:\n", A U, Sigma, V = np.linalg.svd(A, full_matrices=False) print"U:\n", U print"Sigma:\n", Sigma print"V:\n", V A: [[ 4 11 14] [ 8 7 -2]] U: [[-0.9486833 -0.31622777] [-0.31622777 0.9486833 ]] Sigma: [ 18.97366596 9.48683298] V: [[-0.33333333 -0.66666667 -0.66666667] [ 0.66666667 0.33333333 -0.66666667]] In [14]: # Sigma矩陣是奇異值矩陣對(duì)角線上的值 np.diag(Sigma) Out[14]: array([[ 18.97366596, 0. ], [ 0. , 9.48683298]]) In [17]: # check M = U*np.diag(Sigma)*V print"Product:\n", M Product: [[ 4. 11. 14.] [ 8. 7. -2.]] 2.6 廣義逆矩陣 廣義逆矩陣可以使用numpy.linalg模塊中的pinv函數(shù)進(jìn)行求解,。inv函數(shù)只接受方陣作為輸入矩陣,而pinv函數(shù)沒有這個(gè)限制。 In [18]: A = np.mat("4 11 14; 8 7 -2") print"A:\n", A A: [[ 4 11 14] [ 8 7 -2]] In [19]: pseudoinv = np.linalg.pinv(A) print"Pseudo inverse:\n", pseudoinv Pseudo inverse: [[-0.00555556 0.07222222] [ 0.02222222 0.04444444] [ 0.05555556 -0.05555556]] In [20]: # check print"Check pseudo inverse:\n", A*pseudoinv Check pseudo inverse: [[ 1.00000000e+00 0.00000000e+00] [ 8.32667268e-17 1.00000000e+00]] 得到的結(jié)果并非嚴(yán)格意義上的單位矩陣,,但是非常近似,。 In [21]: A = np.mat("0 1 2; 1 0 3; 4 -3 8") print"A:\n", A inverse = np.linalg.inv(A) print"inverse of A:\n", inverse print"check inverse:\n", inverse * A pseudoinv = np.linalg.pinv(A) print"Pseudo inverse:\n", pseudoinv print"Check pseudo inverse:\n", A*pseudoinv A: [[ 0 1 2] [ 1 0 3] [ 4 -3 8]] inverse of A: [[-4.5 7. -1.5] [-2. 4. -1. ] [ 1.5 -2. 0.5]] check inverse: [[ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] Pseudo inverse: [[-4.5 7. -1.5] [-2. 4. -1. ] [ 1.5 -2. 0.5]] Check pseudo inverse: [[ 1.00000000e+00 -2.66453526e-15 8.88178420e-16] [ 8.88178420e-16 1.00000000e+00 2.22044605e-16] [ 0.00000000e+00 3.55271368e-15 1.00000000e+00]]
|
|