读书报告
一、NumPy:高性能科学计算基础库
核心功能与典型用法
数组创建与操作:
python
import numpy as np
创建数组的多种方式
arr1 = np.array([1, 2, 3]) # 从列表创建
arr2 = np.zeros((3, 3)) # 全零数组
arr3 = np.arange(0, 10, 0.5) # 等差序列
arr4 = np.random.randn(100, 100) # 标准正态分布随机数组
数组运算(向量化操作)
arr_sq = arr1**2 # 平方运算
mat_mul = np.dot(arr2, arr2.T) # 矩阵乘法
广播机制应用:
python
不同形状数组间的运算
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
print(a + b) # [[11 22], [13 24]]
实际应用案例:图像卷积运算
python
def convolve2d(image, kernel):
"""二维卷积实现"""
h, w = image.shape
k_h, k_w = kernel.shape
pad_h, pad_w = k_h//2, k_w//2
# 边界填充
padded = np.pad(image, ((pad_h, pad_h), (pad_w, pad_w)), mode='constant')
output = np.zeros_like(image)
# 滑动窗口计算
for i in range(h):
for j in range(w):
output[i,j] = np.sum(padded[i:i+k_h, j:j+k_w] * kernel)
return output
二、SciPy:科学计算工具箱
核心模块与应用
数值积分示例:
python
from scipy import integrate
计算定积分
result, error = integrate.quad(lambda x: np.exp(-x**2), -np.inf, np.inf)
print(f"高斯积分结果: {result:.5f}, 误差估计: {error:.2e}")
解常微分方程
def lotka_volterra(t, z, a, b, c, d):
"""Lotka-Volterra捕食模型"""
x, y = z
return [ax - bxy, -cy + dxy]
sol = integrate.solve_ivp(lotka_volterra, [0, 15], [10, 5],
args=(1.5, 1, 3, 1), dense_output=True)
优化问题求解:
python
from scipy.optimize import minimize
Rosenbrock函数最小化
def rosen(x):
return sum(100.0*(x[1:]-x[:-1]2)2 + (1-x[:-1])**2)
x0 = np.array([-1.5, 1.8])
res = minimize(rosen, x0, method='BFGS', tol=1e-6)
print(f"最优解: {res.x}, 函数值: {res.fun:.4f}")
三、Pandas:数据分析利器
数据处理实战
数据清洗示例:
python
import pandas as pd
创建示例DataFrame
data = {'A': [1, 2, None, 4],
'B': ['a', 'b', 'c', None],
'C': pd.date_range('20230101', periods=4)}
df = pd.DataFrame(data)
数据清洗操作
df_clean = (df
.fillna({'A': df['A'].mean(), 'B': 'unknown'})
.assign(D = lambda x: x['A'] * 2)
.query('A > 1'))
时间序列分析:
python
创建金融时间序列
idx = pd.date_range('2023-01-01', periods=365, freq='D')
ts = pd.Series(np.cumsum(np.random.randn(365)), index=idx)
滚动窗口计算
rolling_mean = ts.rolling(window=30).mean()
rolling_std = ts.rolling(window=30).std()
重采样
monthly = ts.resample('M').ohlc()
四、Matplotlib:专业可视化工具
高级可视化技巧
多子图与样式定制:
python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
创建带样式的图形
plt.style.use('seaborn-darkgrid')
fig = plt.figure(figsize=(12, 6))
2D子图
ax1 = fig.add_subplot(121)
x = np.linspace(0, 10, 100)
ax1.plot(x, np.sin(x), 'C1-', label='sin(x)')
ax1.plot(x, np.cos(x), 'C2--', label='cos(x)')
ax1.set_title('三角函数比较')
ax1.legend()
3D子图
ax2 = fig.add_subplot(122, projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X2 + Y2)
Z = np.sin(R)
ax2.plot_surface(X, Y, Z, cmap='viridis')
ax2.set_title('3D曲面图')
plt.tight_layout()
plt.show()
图像处理应用:
python
from skimage import data, filters
from matplotlib.patches import Circle
图像处理演示
image = data.coins()
edges = filters.sobel(image)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
ax1.imshow(image, cmap='gray')
ax1.set_title('原始图像')
ax1.axis('off')
ax2.imshow(edges, cmap='magma')
ax2.set_title('边缘检测')
ax2.add_patch(Circle((100, 100), 30, fill=False, color='r', linewidth=2))
ax2.axis('off')
五、综合应用案例
案例1:股票数据分析系统
python
获取雅虎财经数据
import yfinance as yf
下载苹果公司股票数据
aapl = yf.download('AAPL', start='2020-01-01', end='2023-01-01')
计算技术指标
aapl['SMA_50'] = aapl['Close'].rolling(50).mean()
aapl['SMA_200'] = aapl['Close'].rolling(200).mean()
aapl['Daily_Return'] = aapl['Close'].pct_change()
可视化
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), gridspec_kw={'height_ratios': [3, 1]})
K线图
aapl['Close'].plot(ax=ax1, label='收盘价')
aapl['SMA_50'].plot(ax=ax1, label='50日均线')
aapl['SMA_200'].plot(ax=ax1, label='200日均线')
ax1.set_title('苹果公司股价分析')
ax1.legend()
收益率分布
aapl['Daily_Return'].hist(ax=ax2, bins=50, alpha=0.6)
ax2.set_title('日收益率分布')
ax2.axvline(aapl['Daily_Return'].mean(), color='r', linestyle='--')
plt.tight_layout()
plt.show()
六、学习资源与进阶方向
推荐书籍:
《Python数据科学手册》Jake VanderPlas
《利用Python进行数据分析》Wes McKinney
《SciPy and NumPy》Eli Bressert
进阶方向:
机器学习中的特征工程(Pandas)
大规模数值计算(NumPy优化)
交互式可视化(Plotly/Bokeh)
信号处理(SciPy.signal)
性能优化技巧:
python
使用NumPy的einsum代替多重循环
传统矩阵乘法
result = np.zeros((A.shape[0], B.shape[1]))
for i in range(A.shape[0]):
for j in range(B.shape[1])):
for k in range(A.shape[1])):
result[i,j] += A[i,k] * B[k,j]
优化后的版本
result = np.einsum('ik,kj->ij', A, B)