第9章 数据处理与可视化
生成器与推导式进阶、numpy 数组运算、matplotlib 柱状图与折线图。
本章学习目标
- 能用推导式/生成器处理大数据量
- 能用 numpy 做数组运算与统计
- 能用 matplotlib 画出柱状图、折线图并保存
- 能处理中文显示与坐标轴标签
本章导览
核心内容
9.1
推导式进阶与生成器
一次处理 10 万行数据:推导式与生成器让内存不炸。
能写嵌套推导式能用生成器表达式惰性求值能用 yield 写生成器函数
知识点
嵌套推导
- [[...] for j in ...] for i in ...] 可以生成二维结构。
- 字典套列表:{班级: [学生...]} 常用推导式快速构造。
- 嵌套超过两层就改循环,可读性优先。
生成器表达式
- (x*x for x in nums) 用圆括号,惰性、不占内存。
- 只能遍历一次;sum/any/all 可以直接吃生成器。
- 处理大文件时:sum(int(l) for l in f) 不用先读进内存。
yield
- 函数里有 yield 就成了生成器函数,每次 next 产出一个值。
- 适合“逐条产出”的场景:读大文件、分页请求、无限序列。
代码示例
▶ 生成器省内存
nums = range(1_000_000)
gen = (n * n for n in nums if n % 2 == 0)
print(sum(gen))👀 运行结果
(一次性求和,不占内存)
▶ yield 逐行产出
def read_rows(path):
with open(path, encoding="utf-8") as f:
for line in f:
yield line.strip().split(",")
for row in read_rows("scores.txt"):
print(row)👀 运行结果
['张三', '89'] ['李四', '92']
常见错误
⚠️ 踩坑与解决
生成器被用完后没数据
→ 生成器只能遍历一次;需要重复用时改回列表或重新创建yield 在普通函数里写成 return
→ 拿不到多条结果;把 return 改成 yield
💡 “数据量大到装不下”的第一反应:把列表推导式的 [] 换成 ()。
9.2
numpy 数据处理
用数组一次算一整列,比 for 循环快几十倍,是数据分析的地基。
能创建数组并查看形状能做向量化运算与切片筛选能用 numpy 算均值/标准差/排序
知识点
创建与形状
- np.array([1,2,3])、np.zeros(5)、np.arange(0, 10, 2)。
- arr.shape 看维度,arr.dtype 看类型,arr.reshape 改形状。
- 二维数组用 arr[行, 列] 取值,arr[:, 0] 取第一列。
向量化运算
- arr * 2、arr + 1 会对每个元素生效,不用写循环。
- 条件筛选:arr[arr > 60] 返回满足条件的元素。
- np.where(条件, 真值, 假值) 相当于数组版 if-else。
统计
- arr.mean()、std()、max()、sum();axis=0 按列、axis=1 按行。
- np.sort / np.argsort 排序与取排名。
代码示例
▶ 数组与统计
import numpy as np
scores = np.array([88, 92, 76, 95, 60])
print(scores.mean(), scores.std().round(2), scores.max())👀 运行结果
82.2 13.2 95
▶ 条件筛选
import numpy as np
scores = np.array([88, 92, 76, 95, 60])
print(scores[scores >= 80])
print(np.where(scores >= 60, "及格", "不及格"))👀 运行结果
[88 92 95] ['及格' '及格' '及格' '及格' '及格']
常见错误
⚠️ 踩坑与解决
ModuleNotFoundError: No module named 'numpy'
→ 没装库;pip install numpyValueError: operands could not be broadcast together
→ 数组长度不一致;检查 shape 是否匹配
💡 能用数组整体运算就别写 for:这是 numpy 的核心价值。
9.3
matplotlib 可视化
把数字变成图:柱状图、折线图、饼图,以及中文显示与保存。
能画柱状图与折线图能设置标题、坐标轴与图例能解决中文乱码并保存图片
知识点
基本流程
- plt.plot(折线) / plt.bar(柱状) / plt.pie(饼图)。
- plt.title/xlabel/ylabel/legend 设置标题与图例,plt.show() 显示。
- plt.savefig("out.png", dpi=150) 保存,要在 show 之前调用。
中文显示
- matplotlib 默认字体没有中文,需设置 plt.rcParams["font.sans-serif"] = ["SimHei"]。
- 同时把 rcParams["axes.unicode_minus"] 设为 False,负号才正常。
多图与样式
- plt.subplots(1, 2) 画多个子图;figsize 控制尺寸。
- 颜色 color、透明度 alpha、网格 grid,能显著提升可读性。
代码示例
▶ 柱状图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
names = ["语文", "数学", "英语"]
scores = [88, 95, 79]
plt.bar(names, scores, color="#4f8cff")
plt.title("各科平均分")
plt.ylabel("分数")
plt.savefig("bar.png", dpi=150)👀 运行结果
生成 bar.png
▶ 折线图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
x = [1, 2, 3, 4]
y = [60, 72, 85, 91]
plt.plot(x, y, marker="o")
plt.xlabel("月份")
plt.ylabel("成绩")
plt.grid(alpha=0.3)
plt.savefig("line.png", dpi=150)👀 运行结果
生成 line.png
常见错误
⚠️ 踩坑与解决
中文显示成方框
→ 没设置中文字体;按上面两行 rcParams 设置保存的图片是空白
→ savefig 写在 show 之后(show 会清空画布);把 savefig 放到 show 前
💡 图表先保证“看得懂”:标题、单位、图例三件套齐全,比花哨配色重要。