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
是聚类数目或初始猜测的聚类中心。 - 它返回质心的坐标和失量。
- 这是 K-means 聚类的核心函数。
-
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)
:- 计算二重积分,
gfun
和hfun
是积分上下限。
- 计算二重积分,
-
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
是初始条件。
- 这是一个通用的 ODE 求解器,
-
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')
:- 一维插值,
x
和y
是数据点,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
是包含数据的字典。
- 将数据保存到 MATLAB
示例:
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')
:- 最小化标量函数
fun
,x0
是初始猜测,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
是截止频率。
- 设计 Butterworth 滤波器,
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}")