ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SciPy 模块列表:核心子模块与实战代码示例

SciPy 模块列表:核心子模块与实战代码示例

1. 引言

SciPy 是 Python 科学计算生态中的核心库,构建在 NumPy 之上,为数值积分、优化、线性代数、信号处理、统计等提供了高效且易用的接口。本文按模块分类梳理 SciPy 的常用子模块,并给出可直接运行的代码示例,帮助读者快速上手。

2. 模块总览

SciPy 由多个功能独立的子模块组成,每个子模块通过scipy.xxx的方式导入。下表列出了最常用的模块及其用途:

模块导入方式主要功能
常量scipy.constants物理常数与单位换算
线性代数scipy.linalg矩阵分解、求解线性方程组
插值scipy.interpolate一维/多维插值
优化scipy.optimize函数最小化、求根、拟合
信号处理scipy.signal滤波、卷积、频谱分析
统计scipy.stats概率分布、假设检验
积分scipy.integrate数值积分、常微分方程求解
稀疏矩阵scipy.sparse稀疏矩阵存储与运算
图像处理scipy.ndimage多维图像滤波、形态学操作
空间算法scipy.spatialKDTree、凸包、距离计算

3. scipy.constants:物理常量与单位

在科学计算中经常需要用到物理常数,scipy.constants提供了高精度的内置常量,并支持常用单位换算。

from scipy import constants 常用物理常量 print("光速 c =", constants.c) print("普朗克常数 h =", constants.h) print("引力常数 G =", constants.G) print("阿伏伽德罗常数 N_A =", constants.N_A) 单位换算:1 英寸等于多少米 print("1 inch =", constants.inch, "米") print("1 电子伏特 =", constants.eV, "焦耳")

4. scipy.linalg:线性代数运算

scipy.linalg在 NumPy 的基础上提供了更丰富的矩阵分解算法,例如 LU、QR、SVD 分解以及求解线性方程组。

import numpy as np from scipy import linalg 构造系数矩阵和常数向量 A = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float) b = np.array([2, 4, -1], dtype=float) 求解线性方程组 Ax = b x = linalg.solve(A, b) print("解 x =", x) 矩阵的 LU 分解 P, L, U = linalg.lu(A) print("L 矩阵:\n", L) print("U 矩阵:\n", U) 奇异值分解 U_svd, s, Vt = linalg.svd(A) print("奇异值 =", s)

5. scipy.interpolate:数据插值

插值用于根据已知离散点估计未知位置的值。scipy.interpolate支持线性插值、三次样条插值等多种方法。

import numpy as np import matplotlib.pyplot as plt from scipy import interpolate 已知数据点 x = np.array([0, 1, 2, 3, 4, 5]) y = np.array([0, 0.8, 0.9, 0.1, -0.8, -1.0]) 创建三次样条插值函数 f_linear = interpolate.interp1d(x, y, kind="linear") f_cubic = interpolate.interp1d(x, y, kind="cubic") 在更细的网格上求值 x_new = np.linspace(0, 5, 100) y_linear = f_linear(x_new) y_cubic = f_cubic(x_new) 可视化对比 plt.plot(x, y, "o", label="原始数据") plt.plot(x_new, y_linear, "--", label="线性插值") plt.plot(x_new, y_cubic, "-", label="三次样条插值") plt.legend() plt.show()

6. scipy.optimize:优化与求根

scipy.optimize是使用频率最高的模块之一,可用于函数最小值求解、方程求根以及曲线拟合。

import numpy as np from scipy import optimize 6.1 标量函数最小化 def f(x): return x**2 + 5 * np.sin(x) result = optimize.minimize_scalar(f, bounds=(-5, 5), method="bounded") print("最小值点 x =", result.x, ",最小值 f(x) =", result.fun) 6.2 方程求根 root = optimize.root_scalar(f, bracket=[-5, 5]) print("方程的根 x =", root.root) 6.3 曲线拟合 x_data = np.linspace(0, 4, 50) y_data = 2.5 * np.exp(-1.3 * x_data) + 0.5 * np.random.normal(size=50) def model(x, a, b, c): return a * np.exp(-b * x) + c params, _ = optimize.curve_fit(model, x_data, y_data) print("拟合参数 a, b, c =", params)

7. scipy.signal:信号处理

scipy.signal提供了滤波器设计、卷积、频谱分析等信号处理工具。

import numpy as np from scipy import signal 生成采样信号:50Hz 正弦波 + 噪声 fs = 1000 # 采样率 1000Hz t = np.linspace(0, 1, fs, endpoint=False) clean = np.sin(2 * np.pi * 50 * t) noisy = clean + 0.5 * np.random.normal(size=t.shape) 设计 4 阶巴特沃斯低通滤波器,截止频率 100Hz b, a = signal.butter(4, 100, fs=fs, btype="low") filtered = signal.lfilter(b, a, noisy) 计算功率谱密度 freqs, psd = signal.periodogram(noisy, fs=fs) print("频谱峰值频率 =", freqs[np.argmax(psd)], "Hz") 卷积操作 kernel = np.ones(5) / 5 convolved = signal.convolve(noisy, kernel, mode="same")

8. scipy.stats:统计分析

scipy.stats包含大量概率分布、统计函数和假设检验工具,是数据分析的常用模块。

import numpy as np from scipy import stats 8.1 生成正态分布随机数 data = stats.norm.rvs(loc=0, scale=1, size=1000, random_state=42) 8.2 计算描述性统计量 print("均值 =", np.mean(data)) print("标准差 =", np.std(data)) print("偏度 =", stats.skew(data)) print("峰度 =", stats.kurtosis(data)) 8.3 t 检验:检验均值是否等于 0 t_stat, p_value = stats.ttest_1samp(data, 0) print("t 统计量 =", t_stat, ",p 值 =", p_value) 8.4 正态性检验 shapiro_stat, shapiro_p = stats.shapiro(data) print("Shapiro-Wilk 检验 p 值 =", shapiro_p) 8.5 概率密度函数 x = np.linspace(-4, 4, 100) pdf = stats.norm.pdf(x, loc=0, scale=1) cdf = stats.norm.cdf(x, loc=0, scale=1)

9. scipy.integrate:数值积分与微分方程

scipy.integrate支持定积分计算以及常微分方程(ODE)的数值求解。

import numpy as np from scipy import integrate 9.1 定积分:∫₀¹ x² dx result, error = integrate.quad(lambda x: x**2, 0, 1) print("定积分结果 =", result, ",误差估计 =", error) 9.2 二重积分 def integrand(y, x): return x * y result2, error2 = integrate.dblquad(integrand, 0, 1, lambda x: 0, lambda x: 1) print("二重积分结果 =", result2) 9.3 求解常微分方程 dy/dt = -2y,初值 y(0) = 1 def ode_func(y, t): return -2 * y t_span = np.linspace(0, 5, 100) y0 = [1.0] solution = integrate.odeint(ode_func, y0, t_span) print("t=5 时 y =", solution[-1][0])

10. scipy.sparse:稀疏矩阵

当矩阵中绝大多数元素为零时,使用稀疏矩阵可以大幅节省内存并提升运算速度。

import numpy as np from scipy import sparse 构造一个 1000x1000 的稀疏矩阵,仅少量非零元素 dense = np.zeros((1000, 1000)) dense[0, 0] = 1 dense[100, 200] = 2 dense[999, 999] = 3 转换为 CSR 格式稀疏矩阵 sparse_matrix = sparse.csr_matrix(dense) print("稀疏矩阵存储的非零元素个数 =", sparse_matrix.nnz) print("稀疏矩阵形状 =", sparse_matrix.shape) 稀疏矩阵的算术运算 sparse_result = sparse_matrix + sparse_matrix.transpose() 稀疏矩阵与向量的乘法 vector = np.ones(1000) result_vec = sparse_matrix.dot(vector) print("稀疏矩阵乘向量结果的前 3 个元素 =", result_vec[:3])

11. scipy.ndimage:多维图像处理

scipy.ndimage提供多维数组的滤波、形态学操作和测量功能,常用于图像处理。

import numpy as np from scipy import ndimage 生成一个带噪声的二维图像 image = np.zeros((100, 100)) image[30:70, 30:70] = 1 noisy_image = image + 0.1 * np.random.normal(size=image.shape) 高斯滤波平滑图像 smoothed = ndimage.gaussian_filter(noisy_image, sigma=2) 中值滤波去除椒盐噪声 median_filtered = ndimage.median_filter(noisy_image, size=3) 图像膨胀与腐蚀 dilated = ndimage.binary_dilation(image > 0.5) eroded = ndimage.binary_erosion(image > 0.5) 连通域标记 labeled, num_features = ndimage.label(image > 0.5) print("检测到连通域数量 =", num_features)

12. scipy.spatial:空间数据结构

scipy.spatial提供 KDTree、凸包计算、距离矩阵等空间算法,常用于最近邻搜索和几何计算。

import numpy as np from scipy import spatial 生成随机点集 points = np.random.rand(20, 2) 12.1 KDTree 最近邻搜索 tree = spatial.KDTree(points) query_point = np.array([0.5, 0.5]) distance, index = tree.query(query_point) print("最近邻点索引 =", index, ",距离 =", distance) 12.2 计算凸包 hull = spatial.ConvexHull(points) print("凸包顶点数量 =", len(hull.vertices)) 12.3 计算距离矩阵 distance_matrix = spatial.distance_matrix(points, points) print("距离矩阵形状 =", distance_matrix.shape) 12.4 计算两点之间的欧氏距离 dist = spatial.distance.euclidean(points[0], points[1]) print("第 0 点和第 1 点的欧氏距离 =", dist)

13. 总结

SciPy 的模块化设计让科学计算任务变得清晰而高效。实际项目中,这些模块经常组合使用,例如先用scipy.signal预处理信号,再用scipy.stats做统计分析,最后用scipy.optimize拟合模型参数。建议读者结合官方文档,针对自己的业务场景选择合适的模块并动手实践。

返回列表