和数学计算相关的库
Python 提供了丰富的数学计算库,从基础数学运算到高级科学计算。
0x01. 内置数学函数
Python 内置了一些基本的数学函数:
# 基本数学运算
print(abs(-5)) # 5 (绝对值)
print(round(3.14159, 2)) # 3.14 (四舍五入)
print(pow(2, 3)) # 8 (幂运算)
print(divmod(10, 3)) # (3, 1) (商和余数)
# 最大最小值
print(max(1, 2, 3)) # 3
print(min(1, 2, 3)) # 1
print(sum([1, 2, 3])) # 6
# 三角函数(需要 import math)
import math
print(math.sqrt(16)) # 4.0 (平方根)
print(math.ceil(3.2)) # 4 (向上取整)
print(math.floor(3.8)) # 3 (向下取整)
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
0x02. math 模块
import math
# 三角函数
print(math.sin(math.pi / 2)) # 1.0
print(math.cos(0)) # 1.0
print(math.tan(math.pi / 4)) # 1.0
# 反三角函数
print(math.asin(1)) # π/2
print(math.acos(0)) # π/2
print(math.atan(1)) # π/4
# 双曲函数
print(math.sinh(1))
print(math.cosh(1))
print(math.tanh(1))
# 对数函数
print(math.log(10)) # 自然对数
print(math.log10(100)) # 以10为底的对数
print(math.log2(8)) # 以2为底的对数
# 指数函数
print(math.exp(1)) # e^1
print(math.expm1(1)) # e^1 - 1 (精度更高)
# 阶乘和组合
print(math.factorial(5)) # 120
print(math.comb(10, 3)) # 120 (组合数)
print(math.perm(10, 3)) # 720 (排列数)
# 最大公约数和最小公倍数
print(math.gcd(12, 8)) # 4
print(math.lcm(12, 8)) # 24 (Python 3.9+)
# 浮点数操作
print(math.isfinite(1.0)) # True
print(math.isinf(float('inf'))) # True
print(math.isnan(float('nan'))) # True
0x03. NumPy
NumPy 是 Python 中科学计算的基础库,提供了高性能的多维数组对象和数学函数。
pip install numpy
数组创建
import numpy as np
# 从列表创建数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 特殊数组
zeros = np.zeros((3, 3)) # 全0数组
ones = np.ones((2, 4)) # 全1数组
full = np.full((2, 2), 7) # 指定值填充
eye = np.eye(3) # 单位矩阵
arange = np.arange(0, 10, 2) # 等差数列
linspace = np.linspace(0, 1, 5) # 等间隔数组
print(arr1) # [1 2 3 4 5]
print(arr2.shape) # (2, 3)
print(arr2.dtype) # int64
数组操作
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 索引和切片
print(arr[0, 1]) # 2
print(arr[:, 1]) # [2 5] (第二列)
print(arr[1, :]) # [4 5 6] (第二行)
# 形状操作
print(arr.reshape(3, 2)) # 改变形状
print(arr.T) # 转置
print(arr.flatten()) # 展平
# 数组拼接
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.concatenate([a, b])) # [1 2 3 4 5 6]
print(np.stack([a, b])) # [[1 2 3], [4 5 6]]
print(np.hstack([a, b])) # 水平拼接
print(np.vstack([[a], [b]])) # 垂直拼接
数学运算
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素级运算
print(a + b) # [5 7 9]
print(a * b) # [4 10 18]
print(a ** 2) # [1 4 9]
print(np.sqrt(a)) # [1.0, 1.414, 1.732]
# 矩阵运算
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(np.dot(A, B)) # 矩阵乘法
print(A @ B) # 矩阵乘法(Python 3.5+)
# 聚合函数
print(np.sum(a)) # 6
print(np.mean(a)) # 2.0
print(np.std(a)) # 标准差
print(np.max(a)) # 3
print(np.min(a)) # 1
print(np.argmax(a)) # 最大值索引
广播机制
import numpy as np
# 数组与标量运算
arr = np.array([1, 2, 3])
print(arr * 2) # [2 4 6]
# 不同形状数组运算
a = np.array([[1], [2], [3]]) # (3, 1)
b = np.array([10, 20, 30]) # (3,)
print(a + b) # [[11, 21, 31], [12, 22, 32], [13, 23, 33]]
随机数生成
import numpy as np
# 设置随机种子
np.random.seed(42)
# 各种分布
print(np.random.rand(3, 3)) # 均匀分布 [0, 1)
print(np.random.randn(3, 3)) # 标准正态分布
print(np.random.randint(0, 10, 5)) # 随机整数
print(np.random.choice([1, 2, 3, 4, 5], 3)) # 随机选择
# 正态分布
print(np.random.normal(loc=0, scale=1, size=1000))
# 排列
arr = np.array([1, 2, 3, 4, 5])
print(np.random.permutation(arr)) # 随机排列
np.random.shuffle(arr) # 原地打乱
0x04. SciPy
SciPy 建立在 NumPy 之上,提供了更多的科学计算功能。
pip install scipy
线性代数
from scipy import linalg
import numpy as np
# 矩阵分解
A = np.array([[1, 2], [3, 4]])
P, L, U = linalg.lu(A) # LU分解
print(f"L:\n{L}")
print(f"U:\n{U}")
# 特征值和特征向量
eigenvalues, eigenvectors = linalg.eig(A)
print(f"特征值: {eigenvalues}")
print(f"特征向量:\n{eigenvectors}")
# 矩阵求逆
A_inv = linalg.inv(A)
print(f"逆矩阵:\n{A_inv}")
# 行列式
det = linalg.det(A)
print(f"行列式: {det}")
# 奇异值分解
U, s, Vh = linalg.svd(A)
优化
from scipy import optimize
# 最小化函数
def f(x):
return (x - 2) ** 2 + 1
result = optimize.minimize(f, x0=0)
print(f"最小值点: {result.x}") # [2.]
print(f"最小值: {result.fun}") # 1.0
# 约束优化
def objective(x):
return x[0]**2 + x[1]**2
def constraint(x):
return x[0] + x[1] - 1
constraints = {'type': 'eq', 'fun': constraint}
result = optimize.minimize(objective, x0=[0, 0], constraints=constraints)
print(f"最优解: {result.x}")
# 曲线拟合
from scipy.optimize import curve_fit
import numpy as np
def func(x, a, b, c):
return a * np.exp(-b * x) + c
x_data = np.linspace(0, 4, 50)
y_data = func(x_data, 2.5, 1.3, 0.5) + 0.2 * np.random.normal(size=50)
popt, pcov = curve_fit(func, x_data, y_data)
print(f"拟合参数: {popt}")
积分
from scipy import integrate
import numpy as np
# 定积分
result, error = integrate.quad(lambda x: x**2, 0, 1)
print(f"积分结果: {result}, 误差: {error}")
# 二重积分
def integrand(y, x):
return x * y**2
result, error = integrate.dblquad(integrand, 0, 1, lambda x: 0, lambda x: 1)
print(f"二重积分: {result}")
# 常微分方程
from scipy.integrate import odeint
def model(y, t):
k = 0.3
dydt = -k * y
return dydt
y0 = 5
t = np.linspace(0, 20, 100)
solution = odeint(model, y0, t)
信号处理
from scipy import signal
import numpy as np
# 滤波器设计
b, a = signal.butter(4, 100, fs=1000, btype='low')
w, h = signal.freqs(b, a)
# 信号滤波
t = np.linspace(0, 1, 1000, False)
sig = np.sin(2 * np.pi * 10 * t) + np.sin(2 * np.pi * 20 * t)
filtered = signal.filtfilt(b, a, sig)
# 卷积
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
conv = signal.convolve(x, y)
0x05. SymPy
SymPy 是 Python 的符号数学库,可以进行符号计算。
pip install sympy
基本符号运算
from sympy import *
# 定义符号
x, y, z = symbols('x y z')
# 符号表达式
expr = x**2 + 2*x + 1
print(expr)
print(expand((x + 1)**2)) # 展开
print(factor(x**2 + 2*x + 1)) # 因式分解
# 简化
print(simplify(sin(x)**2 + cos(x)**2)) # 1
# 代入值
expr = x**2 + 2*x + 1
print(expr.subs(x, 2)) # 9
微积分
from sympy import *
x = symbols('x')
# 求导
print(diff(x**3, x)) # 3*x**2
print(diff(sin(x), x)) # cos(x)
print(diff(exp(x), x)) # exp(x)
# 积分
print(integrate(x**2, x)) # x**3/3
print(integrate(x**2, (x, 0, 1))) # 1/3 (定积分)
print(integrate(exp(-x), (x, 0, oo))) # 1
# 极限
print(limit(sin(x)/x, x, 0)) # 1
print(limit(1/x, x, oo)) # 0
# 级数展开
print(series(sin(x), x, 0, 6)) # x - x**3/6 + x**5/120 + O(x**6)
方程求解
from sympy import *
x, y = symbols('x y')
# 代数方程
print(solve(x**2 - 4, x)) # [-2, 2]
print(solve(x**2 + x + 1, x)) # 复数解
# 方程组
print(solve([x + y - 2, x - y - 0], [x, y])) # {x: 1, y: 1}
# 微分方程
f = Function('f')
print(dsolve(f(x).diff(x) - f(x), f(x))) # f(x) = C1*exp(x)
矩阵运算
from sympy import Matrix
A = Matrix([[1, 2], [3, 4]])
B = Matrix([[5, 6], [7, 8]])
print(A * B) # 矩阵乘法
print(A.T) # 转置
print(A.inv()) # 逆矩阵
print(A.det()) # 行列式
print(A.eigenvals()) # 特征值
0x06. Matplotlib
Matplotlib 是 Python 中最流行的绘图库。
pip install matplotlib
基本绘图
import matplotlib.pyplot as plt
import numpy as np
# 折线图
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, label='sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('正弦函数')
plt.legend()
plt.grid(True)
plt.show()
# 多条线
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()
# 散点图
x = np.random.randn(100)
y = np.random.randn(100)
plt.scatter(x, y, alpha=0.5)
plt.show()
# 柱状图
categories = ['A', 'B', 'C', 'D']
values = [23, 45, 56, 78]
plt.bar(categories, values)
plt.show()
# 饼图
sizes = [15, 30, 45, 10]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.show()
子图
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 第一个子图
axes[0, 0].plot([1, 2, 3], [1, 4, 9])
axes[0, 0].set_title('线性')
# 第二个子图
axes[0, 1].plot([1, 2, 3], [1, 2, 3])
axes[0, 1].set_title('二次')
# 第三个子图
x = np.linspace(0, 10, 100)
axes[1, 0].plot(x, np.sin(x))
axes[1, 0].set_title('sin')
# 第四个子图
axes[1, 1].plot(x, np.cos(x))
axes[1, 1].set_title('cos')
plt.tight_layout()
plt.show()
3D 绘图
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 曲面图
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()
# 散点图
x = np.random.randn(100)
y = np.random.randn(100)
z = np.random.randn(100)
ax.scatter(x, y, z)
plt.show()
0x07. Pandas
Pandas 提供了数据分析和处理的高性能数据结构。
pip install pandas
数据操作
import pandas as pd
import numpy as np
# Series
s = pd.Series([1, 2, 3, 4, 5])
print(s.mean()) # 3.0
print(s.std()) # 标准差
# DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
# 统计
print(df.describe())
print(df.mean())
print(df.corr()) # 相关系数
# 分组统计
df = pd.DataFrame({
'category': ['A', 'B', 'A', 'B', 'A'],
'value': [10, 20, 30, 40, 50]
})
print(df.groupby('category').mean())
# 窗口函数
df = pd.DataFrame({'value': range(10)})
df['rolling_mean'] = df['value'].rolling(window=3).mean()
参考
目录