# 線性代數
# numpy.linalg模組包含線性代數的函式。使用這個模組,可以計算逆矩陣、求特徵值、解線性方程組以及求解行列式等。
import numpy as np
# 1. 計算逆矩陣
# 建立矩陣
a = np.mat("0 1 2;1 0 3;4 -3 8")
print (a)
#[[ 0 1 2]
# [ 1 0 3]
# [ 4 -3 8]]
# 使用inv函式計算逆矩陣
inv = np.linalg.inv(a)
print (inv)
#[[-4.5 7. -1.5]
# [-2. 4. -1. ]
# [ 1.5 -2. 0.5]]
# 檢查原矩陣和求得的逆矩陣相乘的結果為單位矩陣
print (a * inv)
#[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]
# 注:矩陣必須是方陣且可逆,否則會丟擲linalgerror異常。
# 2. 求解線性方程組
# numpy.linalg中的函式solve可以求解形如 ax = b 的線性方程組,其中 a 為矩陣,b 為一維或二維的陣列,x 是未知變數
import numpy as np
#建立矩陣和陣列
b = np.mat("1 -2 1;0 2 -8;-4 5 9")
b = np.array([0,8,-9])
# 呼叫solve函式求解線性方程
x = np.linalg.solve(b,b)
print (x)
#[ 29. 16. 3.]
# 使用dot函式檢查求得的解是否正確
print (np.dot(b , x))
# [[ 0. 8. -9.]]
# 3. 特徵值和特徵向量
# 特徵值(eigenvalue)即方程 ax = ax 的根,是乙個標量。其中,a 是乙個二維矩陣,x 是乙個一維向量。特徵向量(eigenvector)是關於特徵值的向量
# numpy.linalg模組中,ei**als函式可以計算矩陣的特徵值,而eig函式可以返回乙個包含特徵值和對應的特徵向量的元組
import numpy as np
# 建立乙個矩陣
c = np.mat("3 -2;1 0")
# 呼叫ei**als函式求解特徵值
c0 = np.linalg.ei**als(c)
print (c0)
# [ 2. 1.]
# 使用eig函式求解特徵值和特徵向量 (該函式將返回乙個元組,按列排放著特徵值和對應的特徵向量,其中第一列為特徵值,第二列為特徵向量)
c1,c2 = np.linalg.eig(c)
print (c1)
# [ 2. 1.]
print (c2)
#[[ 0.89442719 0.70710678]
# [ 0.4472136 0.70710678]]
# 使用dot函式驗證求得的解是否正確
for i in range(len(c1)):
print ("left:",np.dot(c,c2[:,i]))
print ("right:",c1[i] * c2[:,i])
#left: [[ 1.78885438]
# [ 0.89442719]]
#right: [[ 1.78885438]
# [ 0.89442719]]
#left: [[ 0.70710678]
# [ 0.70710678]]
#right: [[ 0.70710678]
# [ 0.70710678]]
# 4.奇異值分解
# svd(singular value decomposition,奇異值分解)是一種因子分解運算,將乙個矩陣分解為3個矩陣的乘積
# numpy.linalg模組中的svd函式可以對矩陣進行奇異值分解。該函式返回3個矩陣——u、sigma和v,其中u和v是正交矩陣,sigma包含輸入矩陣的奇異值。
import numpy as np
# 分解矩陣
d = np.mat("4 11 14;8 7 -2")
# 使用svd函式分解矩陣
u,sigma,v = np.linalg.svd(d,full_matrices=false)
print ("u:",u)
#u: [[-0.9486833 -0.31622777]
# [-0.31622777 0.9486833 ]]
print ("sigma:",sigma)
#sigma: [ 18.97366596 9.48683298]
print ("v",v)
#v [[-0.33333333 -0.66666667 -0.66666667]
# [ 0.66666667 0.33333333 -0.66666667]]
# 結果包含等式中左右兩端的兩個正交矩陣u和v,以及中間的奇異值矩陣sigma
# 使用diag函式生成完整的奇異值矩陣。將分解出的3個矩陣相乘
print (u * np.diag(sigma) * v)
#[[ 4. 11. 14.]
# [ 8. 7. -2.]]
# 5. 廣義逆矩陣
# 使用numpy.linalg模組中的pinv函式進行求解,
# 注:inv函式只接受方陣作為輸入矩陣,而pinv函式則沒有這個限制
import numpy as np
# 建立乙個矩陣
e = np.mat("4 11 14;8 7 -2")
# 使用pinv函式計算廣義逆矩陣
pseudoinv = np.linalg.pinv(e)
print (pseudoinv)
#[[-0.00555556 0.07222222]
# [ 0.02222222 0.04444444]
# [ 0.05555556 -0.05555556]]
# 將原矩陣和得到的廣義逆矩陣相乘
print (e * pseudoinv)
#[[ 1.00000000e+00 -5.55111512e-16]
# [ 0.00000000e+00 1.00000000e+00]]
# 6. 行列式
# numpy.linalg模組中的det函式可以計算矩陣的行列式
import numpy as np
# 計算矩陣的行列式
f = np.mat("3 4;5 6")
# 使用det函式計算行列式
print (np.linalg.det(f))
# -2.0
python中 python中的 與
這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...
python中的物件 Python中的變數 物件
由於沒時間系統學習下python 只能見乙個問題 乙個問題了 一 初級 物件 關於python中的資料型別,今天重新認識了下。參考 首先,python中,物件才有型別,變數是沒有型別的,它只是物件的 引用 其次,python中物件被分為兩類 可更改物件和不可更改物件 包括numbers,string...
python中的引數傳遞 python中的引數傳遞
begin 前面在介紹python的六大資料型別的時候提到根據資料可變和不可變進行的資料型別分類 python3 的六個標準資料型別中 不可變資料 3 個 number 數字 string 字串 tuple 元組 可變資料 3 個 list 列表 dictionary 字典 set 集合 pytho...