python库:SciPy科学计算库 作者:马育民 • 2026-01-24 10:33 • 阅读:10001 # 介绍 SciPy 是基于 NumPy 构建的**高级科学计算库**,它在 NumPy 提供的基础数组操作之上,封装了大量针对科学、工程领域的实用算法和工具(比如数值积分、优化、信号处理、统计分析等)。 简单来说: - NumPy:主打**基础数组/矩阵操作**(创建、索引、运算); - SciPy:主打**高阶科学计算**(解决实际的数学/工程问题)。 # 核心模块及常用功能 SciPy 按功能划分成多个子模块,新手常用的核心模块如下: | 模块 | 核心功能 | 应用场景 | |---------------------|-------------------------------------------|---------------------------| | `scipy.stats` | 统计分布、假设检验、描述统计(均值/方差) | 数据分析、概率统计 | | `scipy.optimize` | 数值优化、方程求解 | 拟合模型、参数估计 | | `scipy.integrate` | 数值积分、常微分方程求解 | 物理建模、工程计算 | | `scipy.signal` | 信号处理(滤波、卷积、频谱分析) | 音频处理、传感器数据处理 | | `scipy.linalg` | 高级线性代数(比 NumPy 更全) | 矩阵分解、特征值计算 | # 安装 SciPy ```bash pip install scipy numpy # 依赖 NumPy,建议一起安装 ``` # 例子 ### 示例1:统计分析(scipy.stats) 计算数据的均值、方差,或生成指定分布的随机数(对比 PyTorch 的 tensor.mean()): ```python import numpy as np from scipy import stats # 1. 描述统计(对比 PyTorch tensor.mean()) data = np.array([1.2, 3.4, 2.1, 4.5, 2.9]) # SciPy 计算均值、方差 mean = stats.tmean(data) # 等价于 data.mean() var = stats.tvar(data) # 方差 print("均值:", mean) # 输出: 2.82 print("方差:", var) # 输出: 1.417 # 2. 生成正态分布随机数(对比 torch.randn()) normal_data = stats.norm.rvs(loc=0, scale=1, size=(2, 3)) # 均值0,标准差1,shape=(2,3) print("正态分布随机数:\n", normal_data) # 3. 假设检验(判断两组数据均值是否有差异) data1 = [1.1, 2.2, 3.3, 4.4] data2 = [2.1, 3.2, 4.3, 5.4] t_stat, p_value = stats.ttest_ind(data1, data2) print("t检验 p值:", p_value) # p<0.05 则认为两组均值有显著差异 ``` ### 示例2:数值优化(scipy.optimize) 求解函数最小值(比如找 $f(x) = x^2 + 10\sin(x)$ 的最小值): ```python from scipy.optimize import minimize # 定义目标函数 def func(x): return x**2 + 10 * np.sin(x) # 初始猜测值 x0 = np.array([2.0]) # 求解最小值 result = minimize(func, x0) print("最小值点 x:", result.x[0]) # 输出约 -1.306(函数最小值位置) print("最小值 f(x):", result.fun) # 输出约 -7.945(函数最小值) ``` ### 示例3:线性代数(scipy.linalg) 求解线性方程组 $Ax = b$(比 NumPy 支持更多矩阵类型): ```python from scipy.linalg import solve # 定义矩阵 A 和向量 b A = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]]) b = np.array([2, 4, -1]) # 求解 Ax = b x = solve(A, b) print("方程组的解 x:", x) # 输出: [ 2. -2. 9.] ``` # 与 Scikit-learn(sklearn)区别 首先明确两者的核心差异:**SciPy 是“底层科学计算工具集”,sklearn 是“上层机器学习应用框架”**,具体对比如下: | 维度 | SciPy | sklearn | |---------------------|----------------------------------------|--------------------------------------| | 核心定位 | 通用科学计算库(数学/工程算法) | 传统机器学习库(应用级算法) | | 功能聚焦 | 数值积分、优化、线性代数、统计基础、信号处理等**底层数学算法** | 分类、回归、聚类、特征工程、模型评估等**机器学习全流程** | | 设计目标 | 解决纯数学/工程问题 | 快速落地机器学习应用 | | 接口风格 | 函数式接口(如 `scipy.optimize.minimize`) | 面向对象+统一接口(`fit()`/`predict()`) | ### 类比 - SciPy 就像“五金工具原料库”,提供螺丝刀、扳手等基础工具的**原材料和加工方法**; - sklearn 就像“组装好的工具箱”,用 SciPy 的基础工具组装出“分类器”“回归器”等可直接使用的**成品工具**。 ### 依赖关系:sklearn 基于 SciPy 构建 sklearn 是站在 SciPy(以及 NumPy)的肩膀上开发的,它的很多核心算法底层都直接调用了 SciPy 的函数: - 比如 `sklearn.linear_model.LinearRegression`(线性回归)的求解,底层依赖 `scipy.linalg.lstsq`(最小二乘求解); - 比如 `sklearn.cluster.KMeans`(K均值聚类)的距离计算,依赖 `scipy.spatial.distance`; - 比如 `sklearn.metrics` 中的部分统计指标,复用了 `scipy.stats` 的实现。 你可以理解为:**SciPy 是 sklearn 的“算法底座”,sklearn 是 SciPy 在机器学习领域的“应用封装”**。 ### 协同使用 实际数据科学项目中,两者通常配合使用,分工明确: 1. **SciPy 做“底层数据处理/数学计算”**:处理 sklearn 覆盖不到的纯数学问题; 2. **sklearn 做“上层机器学习应用”**:快速搭建模型、评估效果。 ### 什么时候用 SciPy?什么时候用 sklearn? - **用 SciPy**:需要解决纯数学/工程问题时(比如数值积分、解微分方程、自定义统计检验、矩阵分解); - **用 sklearn**:需要快速实现机器学习任务时(比如分类/回归、特征缩放、交叉验证、模型评估); - **两者结合**:机器学习项目中,先用 SciPy 做底层数据清洗/数学计算,再用 sklearn 搭建模型。 ### 总结 1. **层级不同**:SciPy 是底层科学计算库(提供数学算法),sklearn 是上层机器学习库(封装应用级算法); 2. **依赖关系**:sklearn 基于 SciPy/NumPy 构建,复用其底层算法; 3. **协同方式**:SciPy 负责“数学层”处理(异常值、积分、优化),sklearn 负责“应用层”建模(分类、回归、评估),是数据科学项目的黄金组合。 # 与 PyTorch 的区别 - SciPy 基于 CPU 计算,针对**通用科学计算**; - PyTorch 主打 GPU 加速的张量计算,针对**深度学习**; - 两者可以配合使用(比如用 SciPy 预处理数据,再转成 PyTorch 张量训练模型)。 # 总结 1. SciPy 是基于 NumPy 的高阶科学计算库,专注于解决统计、优化、积分等实际科学问题,与 PyTorch(深度学习)、NumPy(基础数组)形成互补; 2. 核心模块中,`scipy.stats`(统计)、`scipy.optimize`(优化)、`scipy.linalg`(线性代数)是新手最常用的; 3. SciPy 数据可通过 `torch.from_numpy()` 直接转为 PyTorch 张量,方便衔接深度学习流程。 原文出处:http://malaoshi.top/show_1GW2eKy462hn.html