1. 数组运算
1.1 元素级运算
加法
$$c_i = a_i + b_i$$
import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = a + b乘法(逐元素)
$$c_i = a_i \cdot b_i$$
c = a * b平方
$$b_i = a_i^2$$
b = a ** 2平方根
$$b_i = \sqrt{a_i}$$
b = np.sqrt(a)指数函数
$$b_i = e^{a_i}$$
b = np.exp(a)自然对数
$$b_i = \ln(a_i)$$
b = np.log(a)以2为底的对数
$$b_i = \log_2(a_i)$$
b = np.log2(a)以10为底的对数
$$b_i = \log_{10}(a_i)$$
b = np.log10(a)幂函数
$$b_i = a_i^p$$
b = np.power(a, p)绝对值
$$b_i = |a_i|$$
b = np.abs(a)符号函数
$$b_i = \text{sign}(a_i) = \begin{cases} -1 & \text{if } a_i < 0 \\ 0 & \text{if } a_i = 0 \\ 1 & \text{if } a_i > 0 \end{cases}$$
b = np.sign(a)1.2 三角函数
正弦函数
$$b_i = \sin(a_i)$$
b = np.sin(a)余弦函数
$$b_i = \cos(a_i)$$
b = np.cos(a)正切函数
$$b_i = \tan(a_i)$$
b = np.tan(a)反正弦函数
$$b_i = \arcsin(a_i)$$
b = np.arcsin(a)反余弦函数
$$b_i = \arccos(a_i)$$
b = np.arccos(a)反正切函数
$$b_i = \arctan(a_i)$$
b = np.arctan(a)双曲正弦函数
$$b_i = \sinh(a_i)$$
b = np.sinh(a)双曲余弦函数
$$b_i = \cosh(a_i)$$
b = np.cosh(a)双曲正切函数
$$b_i = \tanh(a_i)$$
b = np.tanh(a)1.3 矩阵乘法
矩阵乘法
$$C = A \cdot B$$
其中,对于二维矩阵A和B,有:
$$C_{ij} = \sum_k A_{ik} B_{kj}$$
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
C = np.dot(A, B)
# 或者使用 @ 运算符
C = A @ B向量点积
$$c = \sum_i a_i b_i$$
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.dot(a, b)外积
$$C_{ij} = a_i b_j$$
C = np.outer(a, b)2. 统计运算
2.1 基本统计量
平均值
$$\bar{x} = \frac{1}{N} \sum_{i=1}^N x_i$$
mean_x = np.mean(x)标准差
$$\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \bar{x})^2}$$
std_x = np.std(x)方差
$$\sigma^2 = \frac{1}{N} \sum_{i=1}^N (x_i - \bar{x})^2$$
var_x = np.var(x)中位数
$$\text{median} = \begin{cases} x_{\frac{N+1}{2}} & \text{if } N \text{ is odd} \\ \frac{x_{\frac{N}{2}} + x_{\frac{N}{2}+1}}{2} & \text{if } N \text{ is even} \end{cases}$$
median_x = np.median(x)最大值
$$x_{\text{max}} = \max(x_1, x_2, \ldots, x_N)$$
max_x = np.max(x)最小值
$$x_{\text{min}} = \min(x_1, x_2, \ldots, x_N)$$
min_x = np.min(x)百分位数
$$P_p = \text{值,使得 } p\% \text{ 的数据小于等于它}$$
pct_x = np.percentile(x, p)求和
$$S = \sum_{i=1}^N x_i$$
sum_x = np.sum(x)累积和
$$C_i = \sum_{j=1}^i x_j$$
cumsum_x = np.cumsum(x)累积积
$$P_i = \prod_{j=1}^i x_j$$
cumprod_x = np.cumprod(x)2.2 协方差和相关性
协方差
$$\text{Cov}(X,Y) = \frac{1}{N} \sum_{i=1}^N (x_i - \bar{x})(y_i - \bar{y})$$
cov_xy = np.cov(x, y)相关系数
$$\rho_{XY} = \frac{\text{Cov}(X,Y)}{\sigma_X \sigma_Y}$$
corr_xy = np.corrcoef(x, y)3. 线性代数
3.1 矩阵运算
矩阵的逆
$$B = A^{-1}$$
B = np.linalg.inv(A)矩阵的迹
$$\text{tr}(A) = \sum_i A_{ii}$$
trace_A = np.trace(A)矩阵的行列式
$$\det(A)$$
det_A = np.linalg.det(A)矩阵的秩
$$\text{rank}(A)$$
rank_A = np.linalg.matrix_rank(A)矩阵的转置
$$B = A^T$$
B = A.T矩阵的共轭转置
$$B = A^H$$
B = A.conj().T3.2 特征值和特征向量
特征值分解
$$A v = \lambda v$$
lambda_, v = np.linalg.eig(A)奇异值分解 (SVD)
$$A = U \Sigma V^T$$
U, S, Vt = np.linalg.svd(A)QR分解
$$A = QR$$
Q, R = np.linalg.qr(A)Cholesky分解
$$A = LL^T$$
L = np.linalg.cholesky(A)3.3 线性方程组求解
线性方程组
$$Ax = b$$
x = np.linalg.solve(A, b)最小二乘解
$$x = \arg\min_x \|Ax - b\|_2$$
x = np.linalg.lstsq(A, b, rcond=None)[0]4. 广播机制
广播机制允许numpy在不同形状的数组之间进行算术运算。例如,将一个向量与一个标量相加:
$$c_i = a_i + b$$
a = np.array([1,2,3])
b = 1
c = a + b广播规则:
- 如果两个数组的维度数不同,将维度较小的数组的形状前面补1
- 如果两个数组在某个维度上的大小不同,但其中一个为1,则可以广播
- 如果两个数组在某个维度上的大小不同且都不为1,则不能广播
5. 随机数生成
5.1 基本分布
均匀分布
$$X \sim U(a,b)$$
X = np.random.uniform(low=a, high=b, size=n)正态分布
$$X \sim N(\mu,\sigma^2)$$
X = np.random.normal(loc=mu, scale=sigma, size=n)标准正态分布
$$X \sim N(0,1)$$
X = np.random.randn(n)泊松分布
$$X \sim \text{Poisson}(\lambda)$$
X = np.random.poisson(lam=lam, size=n)二项分布
$$X \sim \text{Binomial}(n,p)$$
X = np.random.binomial(n=n, p=p, size=size)指数分布
$$X \sim \text{Exp}(\lambda)$$
X = np.random.exponential(scale=1/lam, size=n)伽马分布
$$X \sim \text{Gamma}(k,\theta)$$
X = np.random.gamma(shape=k, scale=theta, size=n)贝塔分布
$$X \sim \text{Beta}(\alpha,\beta)$$
X = np.random.beta(a=alpha, b=beta, size=n)5.2 随机抽样
从给定数组随机抽样
samples = np.random.choice(a, size=n, replace=True, p=probabilities)随机排列
np.random.shuffle(arr) # 原地打乱
permuted = np.random.permutation(arr) # 返回新数组6. 索引和切片
基本索引
$$b = a_{1:3}$$
a = np.array([1,2,3,4,5])
b = a[1:3] # 获取索引1和2的元素布尔索引
$$b_i = a_i \text{ where } a_i > 2$$
b = a[a > 2]花式索引
$$b = a[[0,2,4]]$$
b = a[[0,2,4]]多维数组索引
$$b = A_{1:3, 2:4}$$
b = A[1:3, 2:4]7. 数组形状操作
改变形状
$$B = \text{reshape}(A,(m,n))$$
A = np.array([1,2,3,4,5,6])
B = A.reshape(2,3)展平数组
$$b = \text{ravel}(A)$$
b = A.ravel()转置
$$B = A^T$$
B = A.T交换轴
$$B = \text{swapaxes}(A, \text{axis1}, \text{axis2})$$
B = np.swapaxes(A, 0, 1)连接数组
$$C = \text{concatenate}([A,B], \text{axis}=0)$$
C = np.concatenate([A, B], axis=0)堆叠数组
$$C = \text{stack}([A,B], \text{axis}=0)$$
C = np.stack([A, B], axis=0)分割数组
$$[A,B] = \text{split}(C, \text{indices})$$
A, B = np.split(C, [3]) # 在索引3处分割8. 卷积和信号处理
一维卷积
$$(f * g)[n] = \sum_m f[m]g[n-m]$$
f = np.array([1,2,3])
g = np.array([0,1,0.5])
conv = np.convolve(f, g, mode='valid')二维卷积
$$(f * g)[i,j] = \sum_m \sum_n f[m,n]g[i-m,j-n]$$
conv2d = np.convolve2d(f, g, mode='valid')9. 傅里叶变换
离散傅里叶变换 (DFT)
$$F(k) = \sum_{n=0}^{N-1} f(n) e^{-j \frac{2\pi}{N} kn}$$
F = np.fft.fft(f)逆离散傅里叶变换 (IDFT)
$$f(n) = \frac{1}{N} \sum_{k=0}^{N-1} F(k) e^{j \frac{2\pi}{N} kn}$$
f = np.fft.ifft(F)二维傅里叶变换
$$F(k,l) = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} f(m,n) e^{-j 2\pi (\frac{km}{M} + \frac{ln}{N})}$$
F2 = np.fft.fft2(f2d)快速傅里叶变换频率
$$ [ \boxed{f_k=\frac{\big((k+\lfloor N/2\rfloor)\bmod N-\lfloor N/2\rfloor\big)\cdot f_s}{N}} ] $$
import numpy as np
N = 8
Ts = 1/1000 # 采样间隔,fs=1000Hz
k = np.arange(N)
# 纯索引式(全非负)
f_plain = k / (N*Ts)
# 快速/实用式(带正负频,未shift)
f_fast = np.fft.fftfreq(N, d=Ts)
10. 梯度和数值微分
一维梯度
$$\nabla f(x) = \left[\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n}\right]$$
gradient = np.gradient(f, x)二维梯度
$$\nabla f(x,y) = \left[\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right]$$
grad_y, grad_x = np.gradient(f2d, y, x)拉普拉斯算子
$$\nabla^2 f = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}$$
laplacian = np.gradient(np.gradient(f, x), x) + np.gradient(np.gradient(f, y), y)11. 插值
线性插值
$$y = y_1 + \frac{y_2 - y_1}{x_2 - x_1}(x - x_1)$$
from scipy.interpolate import interp1d
f_interp = interp1d(x, y, kind='linear')
y_new = f_interp(x_new)12. 数值积分
梯形法则
$$\int_a^b f(x) dx \approx \frac{b-a}{2} [f(a) + f(b)]$$
integral = np.trapz(y, x)辛普森法则
$$\int_a^b f(x) dx \approx \frac{b-a}{6} [f(a) + 4f(\frac{a+b}{2}) + f(b)]$$
from scipy.integrate import simps
integral = simps(y, x)13. 特殊函数
伽马函数
$$\Gamma(z) = \int_0^\infty t^{z-1} e^{-t} dt$$
from scipy.special import gamma
y = gamma(x)贝塞尔函数
$$J_n(x) = \frac{1}{\pi} \int_0^\pi \cos(n\tau - x \sin\tau) d\tau$$
from scipy.special import jv
y = jv(n, x)误差函数
$$\text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_0^x e^{-t^2} dt$$
from scipy.special import erf
y = erf(x)