Numpy零基础vip精讲课程(下篇)_numpy进阶educoder
1. 性能提升技巧
1.1 向量化操作 vs Python 循环
Numpy 的向量化操作比 Python 循环快数十甚至数百倍。
import numpy as np
import time
# 生成一个大型数组
arr = np.random.rand(1000000)
# Python 循环计算平方
start = time.time()
result_loop = [x**2 for x in arr]
print("循环耗时:", time.time() - start) # 约 0.1 秒
# Numpy 向量化计算平方
start = time.time()
result_vec = arr**2
print("向量化耗时:", time.time() - start) # 约 0.001 秒
1.2 内存优化(视图与副本)
- 视图(View):共享数据内存,修改视图会影响原数组。
- 副本(Copy):独立内存,与原数组无关。
a = np.array([1, 2, 3])
b = a[:2] # 视图(共享内存)
c = a.copy() # 副本(独立内存)
b[0] = 99 # 修改视图会影响原数组
print(a) # 输出:[99 2 3]
1.3 使用 Numba 加速
Numba 能将 Python 函数编译为机器码(需额外安装):
pip install numba
from numba import jit
@jit
def sum_array(arr):
total = 0.0
for x in arr:
total += x
return total
# 首次运行会编译,之后速度接近 C 语言
print(sum_array(np.random.rand(1000000)))
2. 高级数据结构
2.1 结构化数组
处理混合数据类型(类似表格):
# 定义数据类型(姓名:字符串,年龄:整数,分数:浮点数)
dtype = [('name', 'U10'), ('age', 'i4'), ('score', 'f4')]
students = np.array([
('Alice', 20, 89.5),
('Bob', 22, 92.3),
('Charlie', 21, 78.0)
], dtype=dtype)
# 按字段查询
print(students['name']) # 输出:['Alice' 'Bob' 'Charlie']
print(students[students['age'] > 20]) # 筛选年龄>20的学生
2.2 掩码数组(处理无效值)
使用 np.ma 模块处理缺失值或无效数据:
data = np.array([1, 2, -999, 4, -999]) # -999 表示无效值
masked_data = np.ma.masked_where(data == -999, data)
# 计算均值(自动忽略无效值)
print(masked_data.mean()) # 输出:(1+2+4)/3 = 2.333
3. 与其它库结合
3.1 Matplotlib 数据可视化
将 Numpy 数组绘制为图表:
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("Sin Wave")
plt.show()
3.2 Pandas 互操作
与 Pandas 无缝转换:
import pandas as pd
# Numpy 数组 → Pandas DataFrame
arr = np.random.rand(3, 2)
df = pd.DataFrame(arr, columns=['A', 'B'])
# DataFrame → Numpy 数组
arr_back = df.to_numpy()
4. 综合项目实战
项目 1:股票数据时间序列分析
# 生成模拟股票价格(100天)
prices = np.cumsum(np.random.randn(100) * 0.1 + 0.05) + 100
# 计算5日移动平均
window_size = 5
moving_avg = np.convolve(prices, np.ones(window_size)/window_size, mode='valid')
# 绘制结果
plt.plot(prices, label='Price')
plt.plot(moving_avg, label='5-Day MA')
plt.legend()
plt.show()
项目 2:简单机器学习预处理
# 生成样本数据(特征矩阵)
X = np.random.rand(100, 3) # 100样本,3个特征
# 标准化(均值为0,标准差为1)
X_mean = X.mean(axis=0)
X_std = X.std(axis=0)
X_normalized = (X - X_mean) / X_std
# 添加偏置项(用于线性回归)
X_bias = np.c_[np.ones(X.shape[0]), X_normalized] # 形状 (100, 4)
下篇总结
- 掌握内容:性能优化、高级数据结构、跨库协作。
- 重点提示:向量化是性能优化的核心,避免 Python 循环。结构化数组适合处理表格型混合数据。
- 练习任务:用向量化操作实现两个大型数组的欧氏距离计算(公式:√(Σ(Ai-Bi)2))。将 CSV 文件中的学生成绩表转为结构化数组,并计算每个学生的平均分。