鄙人學習筆記,這個筆記以例子爲主。
開發工具:Spyder
矩陣
矩陣是numpy.matrix類的對象,該類繼承自numpy.ndarray,任何針對多維數組的操作,對矩陣同樣有效,但作爲子類矩陣又結合其自身的特點,做了必要的擴充,比如:乘法計算、求逆。
矩陣對象的創建
①創建方法1
- 語法
# 如果copy的值爲True(缺省),所得到的矩陣對象與參數中的源容器各自擁有獨立的數據拷貝, 否則共享同一份數據。
numpy.matrix(
ary, # 任何可被解釋爲矩陣的二維容器
copy=True # 是否複製數據(缺省值爲True,即複製數據)
)
備註:默認選項(c),又稱缺省值,是一種計算機術語,指在無決策者干預情況下,對於決策或應用軟件、計算機程序的系統參數的自動選擇。
- 舉個例子
代碼1:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy=True)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))
結果1:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
代碼2:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
m = np.matrix(ary, copy = False)
print(m, type(m))
ary[0, 0] = 999
print(m, type(m))
結果2:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[999 2 3]
[ 4 5 6]
[ 7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
②創建方法2
- 語法
# 等價於:numpy.matrix(..., copy=False)
# 由該函數創建的矩陣對象與參數中的源容器一定共享數據,無法擁有獨立的數據拷貝
numpy.mat(任何可被解釋爲矩陣的二維容器)
# 該函數可以接受字符串形式的矩陣描述:
# 數據項通過空格分隔,數據行通過分號分隔。
#例如:'1 2 3; 4 5 6'
numpy.mat(拼塊規則)
- 例子
代碼:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
ary02 = np.mat(ary)
print(ary02, type(ary02))
ary03 = np.mat('1 2 3;4 5 6')
print(ary03, type(ary03))
結果:
[[1 2 3]
[4 5 6]
[7 8 9]] <class 'numpy.matrixlib.defmatrix.matrix'>
[[1 2 3]
[4 5 6]] <class 'numpy.matrixlib.defmatrix.matrix'>
矩陣的乘法運算
- 語法
# 矩陣的乘法:乘積矩陣的第i行第j列的元素等於
# 被乘數矩陣的第i行與乘數矩陣的第j列的點積
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e * e)
- 例子
代碼:
import numpy as np
ary = np.arange(1, 10).reshape(3, 3)
#數組相乘
print(ary*ary)
#矩陣相乘
print(np.mat(ary)*np.mat(ary))
結果:
[[ 1 4 9]
[16 25 36]
[49 64 81]]
[[ 30 36 42]
[ 66 81 96]
[102 126 150]]
矩陣的逆運算
若兩個矩陣A、B滿足:AB = BA = E (E爲單位矩陣),則稱B和A互爲對方的逆矩陣。
- 語法
e = np.mat('1 2 6; 3 5 7; 4 8 9')
print(e.I) #e的逆矩陣
- 例子
代碼:
import numpy as np
a = np.mat('2 0 0;0 3 0; 0 0 4')
#原矩陣
print(a)
#矩陣的逆
print(a.I)
#矩陣相乘
print(a*a.I)
結果:
[[2 0 0]
[0 3 0]
[0 0 4]]
[[ 0.5 0. -0. ]
[ 0. 0.33333333 -0. ]
[ 0. 0. 0.25 ]]
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
備註1:若矩陣A沒有逆矩陣,則有些numpy版本會報錯,有些則不會,需要注意。若A不爲方陣,則會求出廣義逆矩陣。
備註2:np.linalg.inv(A)也可以求逆矩陣,但A必須爲方陣。若A不爲方陣,則會報錯。
多維數組的矩陣運算
ndarray提供了方法對多維數組進行矩陣運算。
- 語法
a = np.array([
[1, 2, 6],
[3, 5, 7],
[4, 8, 9]])
# 點乘法求ndarray的點乘結果,與矩陣的乘法運算結果相同
k = a.dot(a)
# linalg模塊中的inv方法可以求取a的逆矩陣
l = np.linalg.inv(a)
- 例子
代碼:
import numpy as np
a = np.array([[2, 0, 1],
[0, 4, 0],
[1, 0, 5]])
#原矩陣
print(a)
#矩陣相乘
print(a.dot(a))
#矩陣的逆
print(np.linalg.inv(a))
結果:
[[2 0 1]
[0 4 0]
[1 0 5]]
[[ 5 0 7]
[ 0 16 0]
[ 7 0 26]]
[[ 0.55555556 0. -0.11111111]
[ 0. 0.25 0. ]
[-0.11111111 0. 0.22222222]]
案例
求方程組:
中x, y ,z分別爲多少?
計算方法1:
import numpy as np
a = np.array([[1, 3, 5],
[2, 1, 6],
[1, 1, 2]])
b = np.array([[1], [2], [3]])
inv_a = np.linalg.inv(a)
print(inv_a.dot(b))
結果1:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
計算方法2:
import numpy as np
a = np.mat([[1, 3, 5],
[2, 1, 6],
[1, 1, 2]])
b = np.mat([[1], [2], [3]])
#print(a, type(a))
#print(b, type(b))
print(a.I*b)
結果2:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
計算方法3(最小二乘法,求誤差最小的一組):
import numpy as np
A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.lstsq(A, B)
print(X)
print('---------------')
print(X[0])
結果3:
(matrix([[ 4.71428571],
[ 1.14285714],
[-1.42857143]]), matrix([], shape=(1, 0), dtype=float64), 3, array([ 8.88272389, 1.69756102, 0.46422282]))
---------------
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]
計算方法4(求唯一解):
import numpy as np
A = np.mat('1 3 5;2 1 6;1 1 2')
B = np.mat('1;2;3')
X = np.linalg.solve(A, B)
print(X)
結果4:
[[ 4.71428571]
[ 1.14285714]
[-1.42857143]]