Python之numpy 線性代數

2021-08-22 18:10:14 字數 4348 閱讀 3497

linalg=linear+algebra,norm則表示範數,首先需要注意的是範數是對向量(或者矩陣)的度量,是乙個標量(scalar)

這裡只對常用設定進行說明,x表示要度量的向量,ord表示範數的種類,

範數理論的乙個小推論告訴我們:ℓ1≥ℓ2≥ℓ∞
(2)、用dot函式計算矩陣乘積

x = np.array([[1., 2., 3.], [4., 5., 6.]])

print(x) #[[1. 2. 3.]

#[4. 5. 6.]]

y = np.array([[6., 23.], [-1, 7], [8, 9]])

print(y) #[[ 6. 23.]

#[-1. 7.]

#[ 8. 9.]]

print(x.dot(y)) # 相當於np.dot(x,y)

#[[ 28. 64.]

#[ 67. 181.]]

(3)、np.linalg.inv():矩陣求逆

x = np.array([[1,2],[3,4]])

print(x) #[[1 2]

#[3 4]]

print(x.t) #x的轉置

#[[1 3]

#[2 4]]

print(x.t.dot(x)) #x的轉置乘以x

#[[10 14]

#[14 20]]

print(np.linalg.inv(x.t.dot(x))) #求逆

#[[5. - 3.5]

#[-3.5 2.5]]

(4)、求解線性方程組

# 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.]]

(5)、特徵值和特徵向量

# 特徵值(eigenvalue)即方程 ax = ax 的根,是乙個標量。其中,a 是乙個二維矩陣,x 是乙個一維向量。特徵向量(eigenvector)是關於特徵值的向量

# numpy.linalg模組中,eigvals函式可以計算矩陣的特徵值,而eig函式可以返回乙個包含特徵值和對應的特徵向量的元組

import numpy as np

# 建立乙個矩陣

c = np.mat("3 -2;1 0")

# 呼叫eigvals函式求解特徵值

c0 = np.linalg.eigvals(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]]

(6)、奇異值分解

# 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.]]

(7)、 廣義逆矩陣

# 使用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]]

(8)、行列式

# numpy.linalg模組中的det函式可以計算矩陣的行列式

import numpy as np

# 計算矩陣的行列式

f = np.mat("3 4;5 6")

# 使用det函式計算行列式

print (np.linalg.det(f)) # -2.0

Python筆記 Numpy之線性代數

常用的numpy.linalg函式 np.linalg.diag 以一維陣列的形式返回方陣的對角線 或非對角線 元素,或將一維陣列轉換為方陣 非對角線元素為0 np.linalg.dot 矩陣乘法 np.linalg.trace 計算對角線元素的和 np.linalg.det 計算矩陣行列式 np....

python之Numpy學習筆記

1.匯入numpy庫 import numpy as np2.生成陣列 重要函式 作用 示例 np.array x 將輸入資料轉化為乙個ndarray a list list range 10 b np.array a list np.array x,dtype 將輸入資料轉化為乙個型別為type的...

Python 之 Numpy 三 運算

import numpy as np 加減 a np.array 10,20,30,40 b np.arange 4 c a b print a,b print c 執行結果 10 20 30 40 0 1 2 3 10 19 28 37 三角函式 a np.array 10,20,30,40 b ...