Python中Numpy庫的線性代數

2021-10-10 23:51:14 字數 4912 閱讀 8351

@cible 學習筆記

numpy 定義了 matrix 型別,使用該 matrix 型別建立的是矩陣物件,它們的加減乘除運算預設採

用矩陣方式計算,因此用法和matlab十分類似。但是由於 numpy 中同時存在 ndarray 和 matrix

物件,因此使用者很容易將兩者弄混。這有違 python 的「顯式優於隱式」的原則,因此官方並不推薦

在程式中使用 matrix 。在這裡,我們仍然用 ndarray 來介紹。

矩陣的定義、矩陣的加法、矩陣的數乘、矩陣的轉置與二維陣列完全一致,不再進行說明,但矩陣的

乘法有不同的表示。

numpy.dot(a, b[, out])   計算兩個矩陣的乘積,如果是一維陣列則是它們的內積。

numpy.linalg.eig(a)   計算方陣的特徵值和特徵向量。

numpy.linalg.ei**als(a)   計算方陣的特徵值。

import numpy as np

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

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

z = np.dot(x, y)

print(z) #70

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

print(x)

# [[1 2 3]

# [3 4 5]

# [6 7 8]]

y = np.array([[5, 4, 2], [1, 7, 9], [0, 4, 5]])

print(y)

# [[5 4 2]

# [1 7 9]

# [0 4 5]]

z = np.dot(x, y)

print(z)

# [[ 7 30 35]

# [ 19 60 67]

# [ 37 105 115]]

z = np.dot(y, x)

print(z)

# [[ 29 40 51]

# [ 76 93 110]

# [ 42 51 60]]

import numpy as np

# 建立乙個對角矩陣!

x = np.diag((1, 2, 3))

print(x)

# [[1 0 0]

# [0 2 0]

# [0 0 3]]

print(np.linalg.ei**als(x))

# [1. 2. 3.]

a, b = np.linalg.eig(x)

# 特徵值儲存在a中,特徵向量儲存在b中

print(a)

# [1. 2. 3.]

print(b)

# [[1. 0. 0.]

# [0. 1. 0.]

# [0. 0. 1.]]

有關奇異值分解的原理:奇異值分解(svd)及其應用

u, s, v = numpy.linalg.svd(a, full_matrices=true, compute_uv=true, hermitian=false) 奇異值分解

a 是乙個形如(m,n)矩陣

full_matrices 的取值是為false或者true,預設值為true,這時 u 的大小為(m,m), v 的

大小為(n,n)。否則 u 的大小為(m,k), v 的大小為(k,n) ,k=min(m,n)。

compute_uv 的取值是為false或者true,預設值為true,表示計算 u,s,v 。為false的時候

只計算 s 。

總共有三個返回值 u,s,v , u 大小為(m,m), s 大小為(m,n), v 大小為(n,n), a =

u*s*v 。

其中 s 是對矩陣 a 的奇異值分解。 s 除了對角元素不為 0 ,其他元素都為 0 ,並且對角元

素從大到小排列。 s 中有 n 個奇異值,一般排在後面的比較接近0,所以僅保留比較大的 r

個奇異值。

注:numpy中返回的 v 是通常所謂奇異值分解 a=u*s*v' 中 v 的轉置。

import numpy as np

a = np.array([[4, 11, 14], [8, 7, ‐2]])

print(a)

# [[ 4 11 14]

# [ 8 7 ‐2]]

u, s, vh = np.linalg.svd(a, full_matrices=false)

print(u.shape) # (2, 2)

print(u)

# [[‐0.9486833 ‐0.31622777]

# [‐0.31622777 0.9486833 ]]

print(s.shape) # (2,)

print(np.diag(s))

# [[18.97366596 0. ]

# [ 0. 9.48683298]]

print(vh.shape) # (2, 3)

print(vh)

# [[‐0.33333333 ‐0.66666667 ‐0.66666667]

# [ 0.66666667 0.33333333 ‐0.66666667]]

a = np.dot(u, np.diag(s))

a = np.dot(a, vh)

print(a)

# [[ 4. 11. 14.]

# [ 8. 7. ‐2.]]

q,r = numpy.linalg.qr(a, mode='reduced') 計算矩陣 a 的qr分解。

a 是乙個(m, n)的待分解矩陣。

mode = reduced :返回(m, n)的列向量兩兩正交的矩陣 q ,和(n, n)的三角陣

r (reduced qr分解)。

mode = complete :返回(m, m)的正交矩陣 q ,和(m, n)的三角陣 r (full qr分解)。

import numpy as np

a = np.array([[2, ‐2, 3], [1, 1, 1], [1, 3, ‐1]])

print(a)

# [[ 2 ‐2 3]

# [ 1 1 1]

# [ 1 3 ‐1]]

q, r = np.linalg.qr(a)

print(q.shape) # (3, 3)

print(q)

# [[‐0.81649658 0.53452248 0.21821789]

# [‐0.40824829 ‐0.26726124 ‐0.87287156]

# [‐0.40824829 ‐0.80178373 0.43643578]]

print(r.shape) # (3, 3)

print(r)

# [[‐2.44948974 0. ‐2.44948974]

# [ 0. ‐3.74165739 2.13808994]

# [ 0. 0. ‐0.65465367]]

print(np.dot(q, r))

# [[ 2. ‐2. 3.]

# [ 1. 1. 1.]

# [ 1. 3. ‐1.]]

a = np.allclose(np.dot(q.t, q), np.eye(3))

print(a) # true

l = numpy.linalg.cholesky(a) 返回正定矩陣 a 的 cholesky 分解 a = l*l.t ,其中 l 是下三角。

import numpy as np

a = np.array([[1, 1, 1, 1], [1, 3, 3, 3],

[1, 3, 5, 5], [1, 3, 5, 7]])

print(a)

# [[1 1 1 1]

# [1 3 3 3]

# [1 3 5 5]

# [1 3 5 7]]

print(np.linalg.ei**als(a))

# [13.13707118 1.6199144 0.51978306 0.72323135]

l = np.linalg.cholesky(a)

print(l)

# [[1. 0. 0. 0. ]

# [1. 1.41421356 0. 0. ]

# [1. 1.41421356 1.41421356 0. ]

# [1. 1.41421356 1.41421356 1.41421356]]

print(np.dot(l, l.t))

# [[1. 1. 1. 1.]

# [1. 3. 3. 3.]

# [1. 3. 5. 5.]

# [1. 3. 5. 7.]]

numpy.linalg.norm(x, ord=none, axis=none, keepdims=false) 計算向量或者矩陣的範數。 根據 ord 引數的不同,計算不同的範數: 【 

numpy.linalg.det(a) 計算行列式。 

numpy.linalg.matrix_rank(m, tol=none, hermitian=false) 返回矩陣的秩。 

numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=none, out=none) 方陣的跡就是主對角元素 之和。

設 a 是數域上的乙個 n 階矩陣,若在相同數域上存在另乙個 n 階矩陣 b,使得: ab=ba=e (e 為單 位矩陣),則我們稱 b 是 a 的逆矩陣,而 a 則被稱為可逆矩陣。

numpy.linalg.inv(a)

求解線性方程組 numpy.linalg.solve(a, b) 求解線性方程組或矩陣方程。  

python的numpy庫結構 Numpy庫簡介

今天給大家分享乙個資料分析處理資料的常見的庫 numpy。這個庫是 python 資料分析的基礎,它提供的資料結構比 python 自身的更高效。我們知道 python 有自帶的列表資料結構。numpy 庫和 list 列表有什麼區別呢?python list 列表儲存的是物件的指標,比如 0,1,...

Python的numpy庫中的shape用法

shape函式是numpy.core.fromnumeric中的函式,它的功能是讀取矩陣的維度。例 shape matrixa 返回matrixa的 行數,列數 元組 shape matrixa 0 行數 shape matrixa 1 列數 shape的輸入引數可以使乙個實數,乙個一維列表 陣列 ...

Python中numpy庫unique函式解析

a np.unique a 對於一維陣列或者列表,unique函式去除其中重複的元素,並按元素由大到小返回乙個新的無元素重複的元組或者列表。import numpy as np a 1,2,2,5,3,4,3 a np.unique a b 1,2,2,5,3,4,3 b np.unique b c...