NumPy 常用操作详解汇总和实战示例
下面是 NumPy 常用操作详解汇总,包括数组创建、索引切片、数学运算、广播机制、聚合函数、线性代数等内容,并附有 示例代码:
NumPy基本操作
1. 导入与基本配置
import numpy as np
np.set_printoptions(precision=3, suppress=True) # 显示精度和关闭科学计数法
2. 数组创建
基本创建
a = np.array([1, 2, 3]) # 一维数组
b = np.array([[1, 2], [3, 4]]) # 二维数组
初始化函数
np.zeros((2, 3)) # 全0数组
np.ones((3, 3)) # 全1数组
np.full((2, 2), 7) # 全7数组
np.eye(3) # 单位矩阵
np.arange(0, 10, 2) # [0,2,4,6,8]
np.linspace(0, 1, 5) # 线性等间距序列
np.random.rand(2, 3) # [0,1) 的随机数
np.random.randint(0, 10, (2, 3)) # 整数随机数组
3. 数组索引与切片
一维
a = np.array([10, 20, 30, 40])
print(a[1]) # 20
print(a[-1]) # 40
print(a[1:3]) # [20, 30]
多维
b = np.array([[1, 2], [3, 4], [5, 6]])
print(b[0, 1]) # 2
print(b[1:, 0]) # [3 5]
print(b[:, 1]) # 第2列
布尔索引与花式索引
a = np.array([1, 2, 3, 4, 5])
print(a[a > 3]) # [4 5]
print(a[[0, 2, 4]]) # [1 3 5]
4. 数组操作
形状变换
a.reshape((2, 3))
a.flatten() # 展平
a.T # 转置
np.expand_dims(a, axis=0) # 添加维度
np.squeeze() # 删除单维
拼接与分割
np.concatenate([a, b], axis=0)
np.vstack([a, b]) # 垂直堆叠
np.hstack([a, b]) # 水平堆叠np.split(a, 2) # 等分
np.array_split(a, 3) # 不等分
5. 数学运算(逐元素)
a + b
a - b
a * b
a / b
np.sqrt(a)
np.exp(a)
np.log(a)
np.power(a, 2)
️ 6. 广播机制(Broadcasting)
a = np.array([[1], [2], [3]]) # 3x1
b = np.array([10, 20, 30]) # 1x3
c = a + b # 自动扩展成 3x3
7. 聚合函数(统计)
np.sum(a)
np.mean(a)
np.std(a)
np.var(a)
np.max(a)
np.min(a)
np.argmin(a)
np.argmax(a)
np.median(a)np.sum(a, axis=0) # 按列
np.sum(a, axis=1) # 按行
8. 线性代数操作
from numpy.linalg import inv, det, eig, norm, solveA = np.array([[1, 2], [3, 4]])
b = np.array([1, 2])inv(A) # 逆矩阵
det(A) # 行列式
eig(A) # 特征值与特征向量
solve(A, b) # 解 Ax = b
norm(A) # 范数
9. 排序与去重
np.sort(a) # 排序,不改变原数组
np.argsort(a) # 排序索引
np.unique(a) # 去重并排序
10. 逻辑操作
a > 3 # 布尔数组
np.any(a > 3)
np.all(a < 10)
np.where(a > 3, 1, 0) # 条件筛选
11. 性能与实用技巧
%timeit np.sum(np.arange(10000)) # IPython 中性能测试
a.copy() # 显式复制,避免引用
np.set_printoptions(threshold=1000) # 控制打印长度
实战示例
下面是三个常见场景下 NumPy 的实用应用代码,包括:
- 数据分析(缺失值处理与标准化)
- 图像处理(灰度图像卷积)
- 机器学习(线性回归的最小二乘法实现)
1️、数据分析:缺失值处理 + 标准化
import numpy as np# 假设数据集中包含缺失值 np.nan
data = np.array([[1.0, 2.0, np.nan],[4.0, np.nan, 6.0],[7.0, 8.0, 9.0]
])# 计算每列均值,忽略 nan
col_means = np.nanmean(data, axis=0)# 用均值填充缺失值
inds = np.where(np.isnan(data))
data[inds] = np.take(col_means, inds[1])# 标准化(Z-score)
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
normalized_data = (data - mean) / stdprint("标准化后的数据:\n", normalized_data)
2️、图像处理:二维灰度图像卷积
import numpy as np
from scipy.signal import convolve2d
import matplotlib.pyplot as plt# 模拟一个 5x5 灰度图像
image = np.array([[10, 10, 10, 0, 0],[10, 10, 10, 0, 0],[10, 10, 10, 0, 0],[0, 0, 0, 10, 10],[0, 0, 0, 10, 10]
])# Sobel 边缘检测核
sobel_x = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]
])# 卷积
edge_x = convolve2d(image, sobel_x, mode='same', boundary='fill', fillvalue=0)plt.imshow(edge_x, cmap='gray')
plt.title("Edge Detection")
plt.colorbar()
plt.show()
3️、机器学习:线性回归(最小二乘解)
import numpy as np
import matplotlib.pyplot as plt# 模拟数据: y = 3x + 2 + noise
np.random.seed(42)
X = np.random.rand(100, 1)
y = 3 * X + 2 + 0.1 * np.random.randn(100, 1)# 增加偏置项(X -> [1, x])
X_b = np.hstack([np.ones_like(X), X]) # shape (100, 2)# 最小二乘解 θ = (XᵀX)^(-1)Xᵀy
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ yprint("模型参数:", theta_best.ravel()) # θ0 和 θ1# 可视化拟合
plt.scatter(X, y, label="Data")
plt.plot(X, X_b @ theta_best, color='red', label="Fitted Line")
plt.legend()
plt.show()