介绍
SciPy 是基于 NumPy 构建的高级科学计算库,它在 NumPy 提供的基础数组操作之上,封装了大量针对科学、工程领域的实用算法和工具(比如数值积分、优化、信号处理、统计分析等)。
简单来说:
- NumPy:主打基础数组/矩阵操作(创建、索引、运算);
- SciPy:主打高阶科学计算(解决实际的数学/工程问题)。
核心模块及常用功能
SciPy 按功能划分成多个子模块,新手常用的核心模块如下:
| 模块 | 核心功能 | 应用场景 |
|---|---|---|
scipy.stats |
统计分布、假设检验、描述统计(均值/方差) | 数据分析、概率统计 |
scipy.optimize |
数值优化、方程求解 | 拟合模型、参数估计 |
scipy.integrate |
数值积分、常微分方程求解 | 物理建模、工程计算 |
scipy.signal |
信号处理(滤波、卷积、频谱分析) | 音频处理、传感器数据处理 |
scipy.linalg |
高级线性代数(比 NumPy 更全) | 矩阵分解、特征值计算 |
安装 SciPy
pip install scipy numpy # 依赖 NumPy,建议一起安装
例子
示例1:统计分析(scipy.stats)
计算数据的均值、方差,或生成指定分布的随机数(对比 PyTorch 的 tensor.mean()):
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)$ 的最小值):
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 支持更多矩阵类型):
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 在机器学习领域的“应用封装”。
协同使用
实际数据科学项目中,两者通常配合使用,分工明确:
- SciPy 做“底层数据处理/数学计算”:处理 sklearn 覆盖不到的纯数学问题;
- sklearn 做“上层机器学习应用”:快速搭建模型、评估效果。
什么时候用 SciPy?什么时候用 sklearn?
- 用 SciPy:需要解决纯数学/工程问题时(比如数值积分、解微分方程、自定义统计检验、矩阵分解);
- 用 sklearn:需要快速实现机器学习任务时(比如分类/回归、特征缩放、交叉验证、模型评估);
- 两者结合:机器学习项目中,先用 SciPy 做底层数据清洗/数学计算,再用 sklearn 搭建模型。
总结
- 层级不同:SciPy 是底层科学计算库(提供数学算法),sklearn 是上层机器学习库(封装应用级算法);
- 依赖关系:sklearn 基于 SciPy/NumPy 构建,复用其底层算法;
- 协同方式:SciPy 负责“数学层”处理(异常值、积分、优化),sklearn 负责“应用层”建模(分类、回归、评估),是数据科学项目的黄金组合。
与 PyTorch 的区别
- SciPy 基于 CPU 计算,针对通用科学计算;
- PyTorch 主打 GPU 加速的张量计算,针对深度学习;
- 两者可以配合使用(比如用 SciPy 预处理数据,再转成 PyTorch 张量训练模型)。
总结
- SciPy 是基于 NumPy 的高阶科学计算库,专注于解决统计、优化、积分等实际科学问题,与 PyTorch(深度学习)、NumPy(基础数组)形成互补;
- 核心模块中,
scipy.stats(统计)、scipy.optimize(优化)、scipy.linalg(线性代数)是新手最常用的; - SciPy 数据可通过
torch.from_numpy()直接转为 PyTorch 张量,方便衔接深度学习流程。