NumPy基础公式

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().T

3.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
  2. 如果两个数组在某个维度上的大小不同,但其中一个为1,则可以广播
  3. 如果两个数组在某个维度上的大小不同且都不为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)

添加新评论