numpy基礎(part9)--矩陣

鄙人學習筆記,這個筆記以例子爲主。
開發工具: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]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章