Scipy||第二章 Scipy核心模块详解

2.1 scipy.cluster:聚类分析

scipy.cluster 提供了用于将数据集分成若干类的工具,主要包括矢量量化和层次聚类。

2.1.1 矢量量化 (scipy.cluster.vq)

矢量量化是一种将数据映射到离散空间的过程,常用于图像压缩和特征提取。

  • kmeans(obs, k_or_guess, iter=20, thresh=1e-5)

    • 这是 K-means 聚类的核心函数。obs 是观测数据,k_or_guess 是聚类数目或初始猜测的聚类中心。
    • 它返回质心的坐标和失量。
  • vq(obs, code_book)

    • 将观测数据 obs 映射到最接近的聚类中心 code_book
    • 返回码字和观测数据到聚类中心的距离。

示例

from scipy.cluster.vq import kmeans, vq

# 生成一些随机数据
data = np.random.rand(100, 3)

# 进行 k-means 聚类,聚成3个类
centroids, _ = kmeans(data, 3)

# 使用生成的质心对数据进行矢量量化
code, dist = vq(data, centroids)
2.1.2 层次聚类 (scipy.cluster.hierarchy)

层次聚类是另一种聚类方法,它不需要预先指定聚类数。常用的步骤包括凝聚(从下到上)或分裂(从上到下)的方式。

  • linkage(y, method='single', metric='euclidean')

    • 计算层次聚类的链接矩阵。y 是输入数据,method 指定连接方法(如 'single', 'complete', 'average' 等),metric 指定距离度量方法。
  • dendrogram(Z, p=30, truncate_mode=None)

    • 绘制树状图,Z 是链接矩阵,p 指定要显示的聚类数。
  • fcluster(Z, t, criterion='inconsistent')

    • 根据链接矩阵 Z,按指定的标准分割成 t 个簇。

示例

from scipy.cluster.hierarchy import dendrogram, linkage, fcluster
import matplotlib.pyplot as plt

# 生成随机数据
data = np.random.rand(50, 2)

# 使用 'ward' 方法进行层次聚类
Z = linkage(data, method='ward')

# 绘制树状图
dendrogram(Z)
plt.show()

# 根据层次聚类结果,分成3个类
labels = fcluster(Z, 3, criterion='maxclust')

2.2 scipy.constants:物理和数学常数

scipy.constants 提供了一系列常见的物理和数学常数,特别适合科学计算中的使用。

2.2.1 常量和单位转换
  • physical_constants

    • 返回一个包含常见物理常数的字典,每个常数都有对应的名称、值、单位和不确定性。
  • value(key), unit(key), precision(key)

    • 分别用于提取常量的值、单位和精度。
  • 常见常量

    • pi: 圆周率。
    • c: 光速,单位为 m/s。
    • h: 普朗克常数,单位为 J·s。

示例

from scipy.constants import c, h, pi

# 使用光速常量进行计算
energy = h * c / 500e-9  # 500 nm 的光子的能量

print(f"光速: {c} m/s")
print(f"500 nm 的光子的能量: {energy} J")

2.3 scipy.fft:快速傅里叶变换

scipy.fft 是用于执行快速傅里叶变换(FFT)的一组工具,FFT 是信号处理的重要工具。

2.3.1 傅里叶变换和逆变换
  • fft(x)

    • 计算一维离散傅里叶变换,x 是输入信号。
  • ifft(x)

    • 计算傅里叶变换的逆变换。
  • fft2(x), ifft2(x)

    • 计算二维傅里叶变换及其逆变换,常用于图像处理。

示例

from scipy.fft import fft, ifft
import numpy as np

# 生成一个正弦波
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

# 对信号进行 FFT
Y = fft(y)

# 逆变换以恢复信号
y_inv = ifft(Y)

print(f"原始信号: {y[:5]}")
print(f"恢复信号: {y_inv[:5].real}")  # 取实部

2.4 scipy.integrate:数值积分与微分方程求解

scipy.integrate 提供了数值积分和常微分方程(ODE)的求解工具,广泛应用于物理模拟和工程分析中。

2.4.1 数值积分
  • quad(func, a, b)

    • 计算函数 func[a, b] 区间上的定积分。返回积分值和误差。
  • dblquad(func, a, b, gfun, hfun)

    • 计算二重积分,gfunhfun 是积分上下限。
  • nquad(func, ranges)

    • 计算多重积分,ranges 是一个包含每个积分区间的元组。

示例

from scipy.integrate import quad

# 定义一个简单的函数
def f(x):
    return x**2

# 计算 f(x) 在 [0, 1] 的定积分
result, error = quad(f, 0, 1)
print(f"积分结果: {result}, 误差: {error}")
2.4.2 常微分方程(ODE)求解
  • solve_ivp(fun, t_span, y0)

    • 这是一个通用的 ODE 求解器,fun 是微分方程,t_span 是时间区间,y0 是初始条件。
  • odeint(func, y0, t)

    • 经典的 ODE 求解器,适用于简单问题。

示例

from scipy.integrate import solve_ivp

# 定义微分方程 dy/dt = -2y
def fun(t, y):
    return -2 * y

# 初始条件
y0 = [1]

# 求解微分方程
sol = solve_ivp(fun, [0, 5], y0)
print(f"解的时间点: {sol.t}")
print(f"解的值: {sol.y}")

2.5 scipy.interpolate:插值

scipy.interpolate 提供了用于填补数据集中的缺失值或进行数据平滑的插值函数。

2.5.1 一维插值
  • interp1d(x, y, kind='linear')
    • 一维插值,xy 是数据点,kind 指定插值类型(如 'linear', 'quadratic', 'cubic')。
2.5.2 多维插值
  • griddata(points, values, xi, method='linear')
    • 在多维空间中进行插值,points 是输入数据点,values 是对应的数值,xi 是需要插值的点。

示例

from scipy.interpolate import interp1d
import numpy as np

# 生成一些数据
x = np.linspace(0, 10, num=11, endpoint=True)
y = np.cos(-x**2/9.0)

# 创建插值函数
f = interp1d(x, y, kind='cubic')

# 在新点进行插值
xnew = np.linspace(0, 10, num=41, endpoint=True)
ynew = f(xnew)

2.6 scipy.io:数据输入输出

scipy.io 提供了一些用于读写各种文件格式的工具。

2.6.1 MATLAB 文件
  • loadmat(file_name)
  • 读取 MATLAB .mat 文件,返回一个字典,其中包含 MATLAB 文件中的数据。

  • savemat(file_name, mdict)

    • 将数据保存到 MATLAB .mat 文件,mdict 是包含数据的字典。

示例

from scipy.io import loadmat, savemat

# 读取 MATLAB 文件
data = loadmat('data.mat')
print(data)

# 保存数据到 MATLAB 文件
savemat('new_data.mat', {'array': np.array([1, 2, 3])})

2.7 scipy.linalg:线性代数

scipy.linalg 扩展了 Numpy 的线性代数功能,提供了更丰富的工具。

2.7.1 矩阵运算
  • inv(a)

    • 计算矩阵 a 的逆矩阵。
  • det(a)

    • 计算矩阵 a 的行列式。
  • eig(a), eigh(a)

    • 计算矩阵 a 的特征值和特征向量。eigh 专门用于 Hermitian 矩阵(对称矩阵)。

示例

from scipy.linalg import inv, eig
import numpy as np

# 创建一个矩阵
A = np.array([[1, 2], [3, 4]])

# 计算矩阵的逆
A_inv = inv(A)

# 计算特征值和特征向量
values, vectors = eig(A)

print(f"矩阵的逆: {A_inv}")
print(f"特征值: {values}")
print(f"特征向量: {vectors}")

2.8 scipy.ndimage:多维图像处理

scipy.ndimage 提供多维图像处理功能,如滤波、平移和旋转。

2.8.1 图像滤波
  • gaussian_filter(input, sigma)

    • 对图像应用高斯滤波,sigma 控制滤波的标准差。
  • sobel(input, axis=-1)

    • 计算图像的 Sobel 梯度,用于边缘检测。

示例

from scipy.ndimage import gaussian_filter, sobel
import numpy as np

# 创建一个简单的图像
image = np.array([[1, 2, 1], [0, 0, 0], [1, 2, 1]])

# 应用高斯滤波
filtered_image = gaussian_filter(image, sigma=1)

# 计算 Sobel 边缘
edges = sobel(image)

print(f"滤波后的图像: \n{filtered_image}")
print(f"边缘检测结果: \n{edges}")

2.9 scipy.optimize:优化与根查找

scipy.optimize 提供了函数优化、最小化和根查找的工具。

2.9.1 函数最小化
  • minimize(fun, x0, method='BFGS')
    • 最小化标量函数 funx0 是初始猜测,method 指定优化方法(如 'BFGS', 'Nelder-Mead')。
2.9.2 根查找
  • root(fun, x0)
    • 查找方程 fun(x) = 0 的根,x0 是初始猜测。

示例

from scipy.optimize import minimize, root

# 定义一个目标函数
def objective(x):
    return x**2 + 5 * np.sin(x)

# 使用 BFGS 方法最小化目标函数
result = minimize(objective, x0=0)
print(f"最小值: {result.fun}, 最小点: {result.x}")

# 查找方程 x^2 - 2 = 0 的根
def func(x):
    return x**2 - 2

sol = root(func, x0=1)
print(f"根: {sol.x}")

2.10 scipy.signal:信号处理

scipy.signal 提供了信号处理的各种工具,如滤波器设计和卷积运算。

2.10.1 滤波器设计
  • butter(N, Wn, btype='low')
    • 设计 Butterworth 滤波器,N 是滤波器阶数,Wn 是截止频率。
2.10.2 卷积与相关
  • convolve(in1, in2, mode='full')
    • 计算两个信号的卷积。

示例

from scipy.signal import butter, convolve
import numpy as np

# 设计一个低通 Butterworth 滤波器
b, a = butter(4, 0.2)

# 应用滤波器
filtered_signal = lfilter(b, a, signal)

# 计算两个信号的卷积
conv_result = convolve(signal1, signal2)

2.11 scipy.sparse:稀疏矩阵

scipy.sparse 提供了处理稀疏矩阵的工具,这在处理大规模矩阵时非常有用。

2.11.1 稀疏矩阵创建
  • csr_matrix(data, shape)

    • 创建 Compressed Sparse Row (CSR) 格式的稀疏矩阵。
  • csc_matrix(data, shape)

    • 创建 Compressed Sparse Column (CSC) 格式的稀疏矩阵。

示例

from scipy.sparse import csr_matrix

# 创建一个稀疏矩阵
data = np.array([1, 2, 3, 4])
row_indices = np.array([0, 1, 2, 2])
col_indices = np.array([0, 2, 2, 3])

sparse_matrix = csr_matrix((data, (row_indices, col_indices)), shape=(3, 4))
print(sparse_matrix)

2.12 scipy.spatial:空间数据结构与算法

scipy.spatial 提供了处理空间数据的工具,如 KD 树和 Delaunay 三角剖分。

2.12.1 KD 树
  • KDTree(data)
    • 创建 KD 树,用于高效的最近邻搜索。

示例

from scipy.spatial import KDTree
import numpy as np

# 创建点数据
points = np.array([[1, 2], [3, 4], [5, 6]])

# 创建 KD 树
tree = KDTree(points)

# 查找最近邻
dist, idx = tree.query([3, 3])
print(f"最近邻距离: {dist}, 索引: {idx}")

2.13 scipy.special:特殊函数

scipy.special 包含了大量数学中的特殊函数,如伽马函数和贝塞尔函数。

2.13.1 常见特殊函数
  • gamma(x)

    • 计算伽马函数。
  • jv(n, x)

    • 计算第一类贝塞尔函数。

示例

from scipy.special import gamma, jv

# 计算伽马函数
gamma_val = gamma(5)
print(f"伽马函数值: {gamma_val}")

# 计算贝塞尔函数
bessel_val = jv(0, 2.5)
print(f"贝塞尔函数值: {bessel_val}")

2.14 scipy.stats:统计

scipy.stats 提供了广泛的统计工具,包括概率分布、假设检验等。

2.14.1 分布和假设检验
  • norm()

    • 提供正态分布的概率密度函数(PDF)、累积分布函数(CDF)等。
  • ttest_ind(a, b)

    • 两个独立样本的 t 检验。

示例

from scipy.stats import norm, ttest_ind

# 正态分布的 PDF
pdf = norm.pdf(0, loc=0, scale=1)
print(f"PDF 值: {pdf}")

# 两个独立样本 t 检验
data1 = [1, 2, 3, 4, 5]
data2 = [5, 6, 7, 8, 9]
t_stat, p_val = ttest_ind(data1, data2)
print(f"t 统计量: {t_stat}, p 值: {p_val}")

猜你喜欢

转载自blog.csdn.net/m0_56230886/article/details/141589584