读书报告

一、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)

posted @ 2025-06-23 14:13  cchb  阅读(14)  评论(0)    收藏  举报