NumPy中的矩陣運算函數(shù)小記
一、基本矩陣創(chuàng)建與操作
1.numpy.array()- 創(chuàng)建數(shù)組
功能:創(chuàng)建numpy數(shù)組,是矩陣操作的基礎
解釋:將列表、元組等序列轉(zhuǎn)換為numpy數(shù)組
import numpy as np
# 創(chuàng)建一維數(shù)組
arr1 = np.array([1, 2, 3, 4])
# 創(chuàng)建二維數(shù)組(矩陣)
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 指定數(shù)據(jù)類型
arr_float = np.array([1, 2, 3], dtype=np.float64)
print("一維數(shù)組:", arr1)
print("二維矩陣:\n", matrix)
print("數(shù)據(jù)類型:", arr_float.dtype)一維數(shù)組: [1 2 3 4]
二維矩陣:
[[1 2 3]
[4 5 6]]
數(shù)據(jù)類型: float64
應用場景:任何需要將Python數(shù)據(jù)結(jié)構轉(zhuǎn)換為numpy數(shù)組的場景
2.numpy.matrix()- 創(chuàng)建矩陣對象(已不推薦)
功能:創(chuàng)建專門的矩陣對象
解釋:提供類似MATLAB的矩陣操作接口(注:官方已不推薦使用)
# 創(chuàng)建矩陣對象(不推薦新代碼使用)
mat = np.matrix([[1, 2], [3, 4]])
print("矩陣對象:\n", mat)
print("類型:", type(mat))
矩陣對象:
[[1 2]
[3 4]]
類型: <class 'numpy.matrix'>
二、特殊矩陣創(chuàng)建
3.numpy.zeros()- 創(chuàng)建全零矩陣
功能:創(chuàng)建指定形狀的全零矩陣
# 創(chuàng)建3x3全零矩陣
zeros_3x3 = np.zeros((3, 3))
# 創(chuàng)建2x3x4全零三維數(shù)組
zeros_3d = np.zeros((2, 3, 4))
print("3x3零矩陣:\n", zeros_3x3)
print("2x3x4零數(shù)組形狀:", zeros_3d.shape)
3x3零矩陣:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
2x3x4零數(shù)組形狀: (2, 3, 4)
應用場景:初始化權重矩陣、創(chuàng)建掩碼等
4.numpy.ones()- 創(chuàng)建全1矩陣
功能:創(chuàng)建指定形狀的全1矩陣
# 創(chuàng)建2x4全1矩陣
ones_2x4 = np.ones((2, 4))
# 創(chuàng)建帶數(shù)據(jù)類型的全1矩陣
ones_int = np.ones((3, 3), dtype=int)
print("2x4全1矩陣:\n", ones_2x4)2x4全1矩陣:
[[1. 1. 1. 1.]
[1. 1. 1. 1.]]
5.numpy.eye()/numpy.identity()- 創(chuàng)建單位矩陣
功能:創(chuàng)建單位矩陣(對角線為1,其余為0)
# 創(chuàng)建3x3單位矩陣
I3 = np.eye(3)
# 創(chuàng)建4x4單位矩陣
I4 = np.identity(4)
# 創(chuàng)建非方陣的對角矩陣
rect_eye = np.eye(3, 5)
print("3x3單位矩陣:\n", I3)
print("3x5對角矩陣:\n", rect_eye)3x3單位矩陣:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
3x5對角矩陣:
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]]
應用場景:線性代數(shù)運算、特征值分解、作為恒等變換
6.numpy.diag()- 創(chuàng)建對角矩陣或提取對角線
功能:從對角線元素創(chuàng)建矩陣,或從矩陣提取對角線
# 從對角線創(chuàng)建矩陣
diag_matrix = np.diag([1, 2, 3, 4])
print("對角矩陣:\n", diag_matrix)
# 從矩陣提取對角線
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diagonal = np.diag(matrix)
print("矩陣對角線:", diagonal)
對角矩陣:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
矩陣對角線:
[1 5 9]
三、矩陣運算
7.numpy.dot()/@運算符 - 矩陣乘法
功能:矩陣點積/乘法
解釋:對于二維數(shù)組,計算矩陣乘積
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 三種矩陣乘法方式
result1 = np.dot(A, B)
result2 = A @ B # Python 3.5+ 推薦
result3 = A.dot(B)
print("A @ B = \n", result1)
print("結(jié)果是否相同:", np.array_equal(result1, result2))A @ B =
[[19 22]
[43 50]]
結(jié)果是否相同: True
應用場景:神經(jīng)網(wǎng)絡前向傳播、線性變換、3D圖形變換
8.numpy.matmul()- 矩陣乘法(更通用)
功能:矩陣乘法,支持廣播機制
# 二維矩陣乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
result = np.matmul(A, B)
# 批量矩陣乘法(三維)
batch_A = np.random.randn(10, 3, 4) # 10個3x4矩陣
batch_B = np.random.randn(10, 4, 5) # 10個4x5矩陣
batch_result = np.matmul(batch_A, batch_B) # 得到10個3x5矩陣
print("單個矩陣乘法:\n", result)
print("批量矩陣乘法形狀:", batch_result.shape)單個矩陣乘法:
[[19 22]
[43 50]]
批量矩陣乘法形狀: (10, 3, 5)
9.numpy.inner()- 向量內(nèi)積
功能:計算向量內(nèi)積或高維數(shù)組的內(nèi)積
# 向量內(nèi)積
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
inner_product = np.inner(v1, v2) # 1*4 + 2*5 + 3*6 = 32
print("向量內(nèi)積:", inner_product)向量內(nèi)積: 32
10.numpy.outer()- 外積
功能:計算兩個向量的外積
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6, 7])
outer_product = np.outer(v1, v2)
print("外積矩陣:\n", outer_product)
print("形狀:", outer_product.shape)
外積矩陣:
[[ 4 5 6 7]
[ 8 10 12 14]
[12 15 18 21]]
形狀: (3, 4)
應用場景:協(xié)方差矩陣計算、信號處理
11.numpy.cross()- 向量叉積
功能:計算向量叉積(僅適用于2D或3D向量)
# 3D向量叉積
a = np.array([1, 0, 0])
b = np.array([0, 1, 0])
cross_product = np.cross(a, b) # [0, 0, 1]
print("叉積:", cross_product)叉積: [0 0 1]
四、矩陣分解與線性代數(shù)
12.numpy.linalg.inv()- 矩陣求逆
功能:計算方陣的逆矩陣
A = np.array([[1, 2], [3, 4]])
try:
A_inv = np.linalg.inv(A)
print("矩陣A:\n", A)
print("逆矩陣:\n", A_inv)
print("驗證 A @ A_inv:\n", A @ A_inv) # 應接近單位矩陣
except np.linalg.LinAlgError:
print("矩陣不可逆")矩陣A:
[[1 2]
[3 4]]
逆矩陣:
[[-2. 1. ]
[ 1.5 -0.5]]
驗證 A @ A_inv:
[[1.0000000e+00 0.0000000e+00]
[8.8817842e-16 1.0000000e+00]]
應用場景:求解線性方程組、線性回歸
13.numpy.linalg.pinv()- 偽逆矩陣
功能:計算矩陣的Moore-Penrose偽逆
# 對于非方陣或奇異矩陣
A = np.array([[1, 2], [3, 4], [5, 6]])
A_pinv = np.linalg.pinv(A)
print("矩陣A:\n", A)
print("偽逆矩陣:\n", A_pinv)
print("A @ A_pinv @ A ≈ A:\n", A @ A_pinv @ A)矩陣A:
[[1 2]
[3 4]
[5 6]]
偽逆矩陣:
[[-1.33333333 -0.33333333 0.66666667]
[ 1.08333333 0.33333333 -0.41666667]]
A @ A_pinv @ A ≈ A:
[[1. 2.]
[3. 4.]
[5. 6.]]
14.numpy.linalg.det()- 行列式計算
功能:計算方陣的行列式
A = np.array([[1, 2], [3, 4]])
det_A = np.linalg.det(A)
print("矩陣A:\n", A)
print("行列式:", det_A)矩陣A:
[[1 2]
[3 4]]
行列式: -2.0000000000000004
應用場景:判斷矩陣是否可逆、計算特征值
15.numpy.linalg.eig()- 特征值和特征向量
功能:計算方陣的特征值和特征向量
A = np.array([[1, -1], [2, 4]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print("矩陣A:\n", A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
# 驗證:A * v = λ * v
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
λ = eigenvalues[i]
print(f"驗證特征向量 {i}: A*v = {A @ v}, λ*v = {λ * v}")矩陣A:
[[ 1 -1]
[ 2 4]]
特征值: [2. 3.]
特征向量:
[[-0.70710678 0.4472136 ]
[ 0.70710678 -0.89442719]]
驗證特征向量 0: A*v = [-1.41421356 1.41421356], λ*v = [-1.41421356 1.41421356]
驗證特征向量 1: A*v = [ 1.34164079 -2.68328157], λ*v = [ 1.34164079 -2.68328157]
應用場景:主成分分析(PCA)、振動分析、量子力學
16.numpy.linalg.svd()- 奇異值分解
功能:計算矩陣的奇異值分解
A = np.array([[1, 2], [3, 4], [5, 6]])
U, S, Vh = np.linalg.svd(A, full_matrices=False)
print("矩陣A:\n", A)
print("U矩陣:\n", U)
print("奇異值:", S)
print("Vh矩陣:\n", Vh)
# 重建矩陣
Sigma = np.diag(S)
A_reconstructed = U @ Sigma @ Vh
print("重建矩陣:\n", A_reconstructed)
矩陣A:
[[1 2]
[3 4]
[5 6]]
U矩陣:
[[-0.2298477 0.88346102]
[-0.52474482 0.24078249]
[-0.81964194 -0.40189603]]
奇異值: [9.52551809 0.51430058]
Vh矩陣:
[[-0.61962948 -0.78489445]
[-0.78489445 0.61962948]]
重建矩陣:
[[1. 2.]
[3. 4.]
[5. 6.]]
應用場景:推薦系統(tǒng)、圖像壓縮、降維
17.numpy.linalg.qr()- QR分解
功能:計算矩陣的QR分解
A = np.array([[1, 2], [3, 4], [5, 6]])
Q, R = np.linalg.qr(A)
print("矩陣A:\n", A)
print("Q矩陣:\n", Q)
print("R矩陣:\n", R)
print("驗證 Q*R:\n", Q @ R)
矩陣A:
[[1 2]
[3 4]
[5 6]]
Q矩陣:
[[-0.16903085 0.89708523]
[-0.50709255 0.27602622]
[-0.84515425 -0.34503278]]
R矩陣:
[[-5.91607978 -7.43735744]
[ 0. 0.82807867]]
驗證 Q*R:
[[1. 2.]
[3. 4.]
[5. 6.]]
應用場景:線性最小二乘問題、特征值計算
五、矩陣統(tǒng)計與操作
18.numpy.sum()- 求和
功能:沿指定軸計算數(shù)組元素的和
A = np.array([[1, 2, 3], [4, 5, 6]])
print("矩陣:\n", A)
print("所有元素和:", np.sum(A))
print("每列和:", np.sum(A, axis=0))
print("每行和:", np.sum(A, axis=1))
矩陣:
[[1 2 3]
[4 5 6]]
所有元素和: 21
每列和: [5 7 9]
每行和: [ 6 15]
19.numpy.mean()- 平均值
功能:計算平均值
A = np.array([[1, 2, 3], [4, 5, 6]])
print("矩陣:\n", A)
print("全局均值:", np.mean(A))
print("列均值:", np.mean(A, axis=0))
print("行均值:", np.mean(A, axis=1))
矩陣:
[[1 2 3]
[4 5 6]]
全局均值: 3.5
列均值: [2.5 3.5 4.5]
行均值: [2. 5.]
20.numpy.transpose()/.T- 矩陣轉(zhuǎn)置
功能:計算矩陣轉(zhuǎn)置
A = np.array([[1, 2, 3], [4, 5, 6]])
# 兩種轉(zhuǎn)置方式
A_transpose1 = np.transpose(A)
A_transpose2 = A.T
print("原始矩陣:\n", A)
print("轉(zhuǎn)置矩陣:\n", A_transpose1)
print("兩種方法結(jié)果相同:", np.array_equal(A_transpose1, A_transpose2))
原始矩陣:
[[1 2 3]
[4 5 6]]
轉(zhuǎn)置矩陣:
[[1 4]
[2 5]
[3 6]]
兩種方法結(jié)果相同: True
應用場景:協(xié)方差矩陣計算、線性代數(shù)公式實現(xiàn)
六、矩陣求解與方程
21.numpy.linalg.solve()- 解線性方程組
功能:求解線性方程組 Ax = b
# 解方程組:
# 1*x + 2*y = 5
# 3*x + 4*y = 6
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])
x = np.linalg.solve(A, b)
print("系數(shù)矩陣 A:\n", A)
print("常數(shù)項 b:", b)
print("解 x:", x)
print("驗證 A*x = b:", A @ x)
系數(shù)矩陣 A:
[[1 2]
[3 4]]
常數(shù)項 b: [5 6]
解 x: [-4. 4.5]
驗證 A*x = b: [5. 6.]
22.numpy.linalg.lstsq()- 最小二乘解
功能:計算線性矩陣方程的最小二乘解
# 擬合數(shù)據(jù)點 y = 2x + 1 + 噪聲
x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 3, 5, 7, 9]) + np.random.normal(0, 0.2, 5)
# 構建設計矩陣 A = [[1, x1], [1, x2], ...]
A = np.vstack([np.ones_like(x), x]).T
# 求解最小二乘問題
coeff, residuals, rank, s = np.linalg.lstsq(A, y, rcond=None)
print(f"擬合直線: y = {coeff[1]:.3f}x + {coeff[0]:.3f}")
print(f"殘差平方和: {residuals[0]:.3f}")擬合直線: y = 2.096x + 0.974
殘差平方和: 0.090
七、矩陣重塑與組合
23.numpy.reshape()- 改變數(shù)組形狀
功能:改變數(shù)組形狀而不改變數(shù)據(jù)
A = np.arange(12) # 0到11
A_reshaped = A.reshape(3, 4)
print("原始數(shù)組:", A)
print("重塑為3x4:\n", A_reshaped)
原始數(shù)組: [ 0 1 2 3 4 5 6 7 8 9 10 11]
重塑為3x4:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
24.numpy.concatenate()- 連接數(shù)組
功能:沿指定軸連接數(shù)組序列
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 垂直連接(行方向)
C_vertical = np.concatenate((A, B), axis=0)
# 水平連接(列方向)
C_horizontal = np.concatenate((A, B), axis=1)
print("矩陣A:\n", A)
print("矩陣B:\n", B)
print("垂直連接:\n", C_vertical)
print("水平連接:\n", C_horizontal)
矩陣A:
[[1 2]
[3 4]]
矩陣B:
[[5 6]
[7 8]]
垂直連接:
[[1 2]
[3 4]
[5 6]
[7 8]]
水平連接:
[[1 2 5 6]
[3 4 7 8]]
25.numpy.vstack()和numpy.hstack()- 垂直/水平堆疊
功能:垂直或水平堆疊數(shù)組
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
# 垂直堆疊
C_vertical = np.vstack((A, B))
# 水平堆疊
C_horizontal = np.hstack((A, B))
print("A:", A)
print("B:", B)
print("垂直堆疊:\n", C_vertical)
print("水平堆疊:", C_horizontal)
A: [1 2 3]
B: [4 5 6]
垂直堆疊:
[[1 2 3]
[4 5 6]]
水平堆疊: [1 2 3 4 5 6]
八、可視化示例
import matplotlib.pyplot as plt
import numpy as np
# 創(chuàng)建可視化示例
fig, axes = plt.subplots(2, 3, figsize=(12, 8))
# 1. 單位矩陣可視化
I = np.eye(5)
axes[0, 0].imshow(I, cmap='Blues', interpolation='nearest')
axes[0, 0].set_title('單位矩陣')
axes[0, 0].set_xticks(range(5))
axes[0, 0].set_yticks(range(5))
# 2. 隨機矩陣可視化
random_matrix = np.random.randn(5, 5)
axes[0, 1].imshow(random_matrix, cmap='RdYlBu', interpolation='nearest')
axes[0, 1].set_title('隨機矩陣')
axes[0, 1].set_xticks(range(5))
axes[0, 1].set_yticks(range(5))
# 3. 矩陣乘法示例
A = np.array([[1, 0.5], [0.5, 1]])
B = np.array([[1, 0], [0, 0.5]])
C = A @ B
axes[0, 2].imshow(C, cmap='viridis', interpolation='nearest')
axes[0, 2].set_title('矩陣乘法結(jié)果')
axes[0, 2].set_xticks(range(2))
axes[0, 2].set_yticks(range(2))
# 4. 特征向量可視化
eig_matrix = np.array([[2, 1], [1, 2]])
eigvals, eigvecs = np.linalg.eig(eig_matrix)
axes[1, 0].quiver([0, 0], [0, 0], eigvecs[0, :], eigvecs[1, :],
angles='xy', scale_units='xy', scale=1, color=['r', 'b'])
axes[1, 0].set_xlim(-1.5, 1.5)
axes[1, 0].set_ylim(-1.5, 1.5)
axes[1, 0].set_title('特征向量')
axes[1, 0].grid(True)
axes[1, 0].set_aspect('equal')
# 5. SVD分解可視化
U, S, Vh = np.linalg.svd(eig_matrix)
axes[1, 1].imshow(U @ np.diag(S) @ Vh, cmap='plasma', interpolation='nearest')
axes[1, 1].set_title('SVD重建矩陣')
axes[1, 1].set_xticks(range(2))
axes[1, 1].set_yticks(range(2))
# 6. 3D矩陣可視化(使用2D切片)
matrix_3d = np.random.rand(4, 4, 4)
axes[1, 2].imshow(matrix_3d[:, :, 0], cmap='coolwarm', interpolation='nearest')
axes[1, 2].set_title('3D矩陣的2D切片')
axes[1, 2].set_xticks(range(4))
axes[1, 2].set_yticks(range(4))
plt.tight_layout()
plt.show()

九、總結(jié)與應用場景對比表
| 函數(shù)類別 | 關鍵函數(shù) | 主要應用場景 |
|---|---|---|
| 創(chuàng)建矩陣 | zeros(), ones(), eye(), diag() | 初始化、構建特殊矩陣 |
| 基本運算 | dot(), matmul(), transpose() | 線性變換、神經(jīng)網(wǎng)絡 |
| 高級運算 | cross(), outer(), inner() | 物理模擬、信號處理 |
| 線性代數(shù) | inv(), det(), eig(), svd() | 矩陣分解、降維、PCA |
| 方程求解 | solve(), lstsq() | 線性方程組、回歸分析 |
| 統(tǒng)計操作 | sum(), mean(), std() | 數(shù)據(jù)分析、特征工程 |
| 矩陣操作 | reshape(), concatenate() | 數(shù)據(jù)預處理、批處理 |
十、性能提示
- 使用廣播機制:避免顯式循環(huán),利用numpy廣播提高性能
- 矩陣乘法選擇:小矩陣用@運算符,批量矩陣用matmul
- 原地操作:使用out參數(shù)避免不必要的內(nèi)存分配
- 數(shù)據(jù)類型選擇:根據(jù)精度需求選擇float32或float64
# 性能優(yōu)化示例 A = np.random.randn(1000, 1000) B = np.random.randn(1000, 1000) # 更快的矩陣乘法(使用優(yōu)化的BLAS庫) result = A @ B # 自動使用優(yōu)化的實現(xiàn) # 避免不必要的復制 C = np.empty_like(A) np.matmul(A, B, out=C) # 指定輸出位置
NumPy的矩陣運算功能強大且高效,是科學計算和數(shù)據(jù)分析的基礎工具。掌握這些函數(shù)能顯著提升數(shù)據(jù)處理和模型開發(fā)的效率。
到此這篇關于NumPy中的矩陣運算函數(shù)小記的文章就介紹到這了,更多相關NumPy 矩陣運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入理解Python虛擬機中復數(shù)(complex)的實現(xiàn)原理及源碼剖析
在本篇文章當中主要給大家介紹在 cpython 虛擬機當中是如何實現(xiàn) 復數(shù) complex 這個數(shù)據(jù)類型的,這個數(shù)據(jù)類型在 cpython 當中一應該是一個算比較簡單的數(shù)據(jù)類型了,非常容易理解2023-03-03
Python生產(chǎn)者與消費者模型中的優(yōu)勢介紹
這篇文章主要介紹了python多進程中的生產(chǎn)者和消費者模型優(yōu)勢,生產(chǎn)者是指生產(chǎn)數(shù)據(jù)的任務,消費者是指消費數(shù)據(jù)的任務。當生產(chǎn)者的生產(chǎn)能力遠大于消費者的消費能力,生產(chǎn)者就需要等消費者消費完才能繼續(xù)生產(chǎn)新的數(shù)據(jù)2023-03-03
python?pandas分割DataFrame中的字符串及元組的方法實現(xiàn)
本文主要介紹了python?pandas分割DataFrame中的字符串及元組的方法實現(xiàn),主要介紹了3種方法,具有一定的參考價值,感興趣的可以了解一下2022-03-03

