NumPy - 線性代數



NumPy 中的線性代數

線性代數是數學的一個分支,它處理向量、矩陣和線性變換。

NumPy 包含 **numpy.linalg** 模組,該模組提供了線性代數所需的所有功能。下表描述了此模組中的一些重要函式。

序號 函式和描述
1 dot

兩個陣列的點積

2 vdot

兩個向量的點積

3 inner

兩個陣列的內積

4 matmul

兩個陣列的矩陣積

5 determinant

計算陣列的行列式

6 solve

求解線性矩陣方程

7 inv

查詢矩陣的乘法逆矩陣

建立矩陣

在 NumPy 中,我們可以使用陣列建立矩陣。矩陣只是二維陣列,可以使用 np.array() 函式建立。您可以將矩陣的元素指定為巢狀列表。

示例

以下是一個基本示例,其中我們建立了一個包含兩行三列的矩陣:

import numpy as np

# Creating a 2x3 matrix
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("Matrix:\n", matrix)

獲得以下輸出:

Matrix:
[[1 2 3]
 [4 5 6]]

矩陣運算

矩陣運算線上性代數中是基礎,涉及對矩陣執行算術運算。在 NumPy 中,您可以輕鬆地執行矩陣的加法、減法、乘法和轉置。

矩陣加法和減法

矩陣加法和減法是逐元素執行的。這意味著每個矩陣中對應的元素相加或相減。這兩種運算都需要矩陣具有相同的形狀。

示例

在下面的示例中,我們使用兩個 2x2 NumPy 陣列 **A** 和 **B** 執行逐元素矩陣加法和減法:

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Matrix Addition
C = A + B
print("Matrix Addition:\n", C)

# Matrix Subtraction
D = A - B
print("Matrix Subtraction:\n", D)

這將產生以下結果:

Matrix Addition:
[[ 6  8]
 [10 12]]
Matrix Subtraction:
[[-4 -4]
 [-4 -4]]

矩陣乘法

矩陣乘法可以使用 **@** 運算子或 **np.dot()** 函式完成。與逐元素乘法不同,矩陣乘法涉及對行和列的乘積求和。

示例

這裡,我們使用 **@** 運算子和 **np.dot()** 函式對兩個 2x2 NumPy 陣列 **A** 和 **B** 執行矩陣乘法:

import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Matrix Multiplication
C = A @ B
print("Matrix Multiplication with @:\n", C)

D = np.dot(A, B)
print("Matrix Multiplication with np.dot():\n", D)

以下為上述程式碼的輸出:

Matrix Multiplication with @:
[[19 22]
 [43 50]]
Matrix Multiplication with np.dot():
[[19 22]
 [43 50]]

矩陣轉置

矩陣的轉置是透過沿其對角線翻轉獲得的,有效地將行與列交換。這可以使用 **.T** 屬性實現。

示例

在這裡,我們轉置一個 2x2 NumPy 陣列 **A** 以獲得其轉置 AT

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Transposing the matrix
A_T = A.T
print("Transpose of A:\n", A_T)

獲得的輸出如下所示:

Transpose of A:
[[1 3]
 [2 4]]

行列式和逆矩陣

行列式指示矩陣是否可逆(非奇異)。如果矩陣的行列式非零,則該矩陣可逆。相反,如果行列式為零,則該矩陣是奇異的,不可逆。它還用於:

  • 求解線性方程組。
  • 更改積分中的變數。
  • 計算面積和體積。
  • 定義方陣的特徵多項式。

矩陣的 **逆矩陣** 是一個矩陣,當它與原始矩陣相乘時,會得到單位矩陣。

A X A-1 = A-1 = I

NumPy 提供了各種函式來計算矩陣的行列式和逆矩陣。

計算行列式

我們可以使用 **linalg.det()** 函式計算矩陣的行列式。它在內部使用 LAPACK 例程來計算行列式(透過 LU 分解)。

示例

在下面的示例中,我們使用 np.linalg.det() 函式計算 2x2 NumPy 陣列 **A** 的行列式:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Determinant of the matrix
det = np.linalg.det(A)
print("Determinant of A:", det)

執行上述程式碼後,我們得到以下輸出:

Determinant of A: -2.0000000000000004

計算逆矩陣

我們可以使用 **linalg.inv()** 函式計算矩陣的逆矩陣。

示例

這裡,我們使用 np.linalg.inv() 函式計算 2x2 NumPy 陣列 **A** 的逆矩陣:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Inverse of the matrix
A_inv = np.linalg.inv(A)
print("Inverse of A:\n", A_inv)

產生的結果如下:

Inverse of A:
 [[-2.   1. ]
 [ 1.5 -0.5]]

特徵值和特徵向量

特徵值和特徵向量對於理解線性變換至關重要。可以使用 **np.linalg.eig()** 函式計算它們。

特徵值表示變換的大小,而特徵向量表示方向。

示例

在下面所示的示例中,我們使用 np.linalg.eig() 函式計算 2x2 NumPy 陣列 **A** 的特徵值和特徵向量:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Computing eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)

我們得到如下所示的輸出:

Eigenvalues: [-0.37228132  5.37228132]
Eigenvectors:
[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

求解線性系統

在 Numpy 中,可以使用 **np.linalg.solve()** 函式求解線性方程組。此函式查詢滿足矩陣方程表示的線性方程的變數值:

Ax = b

其中,**A** 表示矩陣,**b** 是一個向量。

示例

在這個示例中,我們正在求解由矩陣方程 **Ax=b** 表示的線性方程組,其中 **A** 是一個 2x2 矩陣,**b** 是一個向量。我們使用 np.linalg.solve() 函式計算滿足該方程的 **x** 的值:

import numpy as np
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])

# Solving the linear system Ax = b
x = np.linalg.solve(A, b)
print("Solution of the linear system:", x)

獲得以下輸出:

Solution of the linear system: [2. 3.]

奇異值分解 (SVD)

SVD 是將矩陣分解為三個矩陣:**U**(左奇異向量)、**S**(奇異值)和 **V**(右奇異向量)。它在各種應用中都很有用,包括訊號處理和統計學。

您可以使用 NumPy 中的 **np.linalg.svd()** 函式執行 SVD。

示例

在下面的示例中,我們對 2x2 矩陣 **A** 執行奇異值分解 (SVD),它將其分解為三個分量:U、S 和 V:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Performing SVD
U, S, V = np.linalg.svd(A)
print("U matrix:\n", U)
print("Sigma values:", S)
print("V matrix:\n", V)

這將產生以下結果:

U matrix:
[[-0.40455358 -0.9145143 ]
 [-0.9145143   0.40455358]]
Sigma values: [5.4649857  0.36596619]
V matrix:
[[-0.57604844 -0.81741556]
 [ 0.81741556 -0.57604844]]

範數和條件數

**範數** 測量向量和矩陣的大小或長度,有助於量化其大小。**條件數** 指示矩陣的解對其輸入變化的敏感程度,表明它在數值上可以解決的程度。

計算範數

範數測量向量和矩陣的大小或長度。我們可以使用 NumPy **linalg.norm()** 函式計算不同型別的範數,例如 Frobenius 範數和歐幾里得範數。

示例

在下面的示例中,我們正在計算 2x2 矩陣 **A** 的 Frobenius 範數,它提供了其整體大小的度量,類似於向量的歐幾里得範數。

我們還計算了 3D 向量的 L2 範數(歐幾里得範數),它量化了其在空間中的長度:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Frobenius norm
norm = np.linalg.norm(A, 'fro')
print("Frobenius norm of A:", norm)

# L2 norm (Euclidean norm)
vector = np.array([1, 2, 3])
l2_norm = np.linalg.norm(vector)
print("L2 norm of vector:", l2_norm)

以下為上述程式碼的輸出:

Frobenius norm of A: 5.477225575051661
L2 norm of vector: 3.7416573867739413

計算條件數

矩陣的條件數衡量線性系統的解對資料中誤差的敏感程度。

它可以使用 NumPy **linalg.cond()** 函式計算。較高的條件數表示矩陣接近奇異,這使得準確求解線性方程組更具挑戰性。

示例

這裡,我們正在計算 2x2 矩陣 **A** 的條件數:

import numpy as np
A = np.array([[1, 2], [3, 4]])

# Condition number
cond = np.linalg.cond(A)
print("Condition number of A:", cond)

獲得的輸出如下所示:

Condition number of A: 14.933034373659268
廣告
© . All rights reserved.