python库:SciPy科学计算库

介绍

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 在机器学习领域的“应用封装”。

协同使用

实际数据科学项目中,两者通常配合使用,分工明确:

  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 张量,方便衔接深度学习流程。

原文出处:/show_1GW2eKy462hn.html