NumPy Matplotlib(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
引言:为什么选择NumPy和Matplotlib?
在Python生态中,NumPy和Matplotlib是数据分析与可视化的基石工具。NumPy提供高性能的数值计算能力,而Matplotlib则是将数据转化为直观图像的桥梁。对于编程初学者,这两个库是入门数据科学的必经之路;对于中级开发者,它们是优化效率、增强表达能力的利器。本文将通过循序渐进的方式,结合实际案例,带您掌握这对黄金组合的使用技巧。
NumPy基础:构建高效的数据容器
数组:比列表更强大的数据结构
Python原生列表(list)虽然灵活,但在处理大规模数值计算时效率低下。NumPy的ndarray
(N维数组)通过同质化存储和向量化操作,将运算速度提升数倍。可以想象,列表如同杂乱无章的抽屉,而NumPy数组则像整齐排列的货架——每个位置都有固定尺寸和类型,便于快速存取。
import numpy as np
arr_1d = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr_1d)
matrix = np.array([[1, 2], [3, 4]])
print("二维数组:\n", matrix)
索引与切片:精准定位数据
NumPy的索引规则与列表类似,但支持多维度操作。例如访问二维数组的第二行第一列元素:
print(matrix[1, 0]) # 输出 3
切片操作可以提取子数组:
subset = matrix[0:2, 1] # 提取所有行的第二列
print("切片结果:", subset)
数学运算:向量化的魔力
NumPy的核心优势在于向量化运算,即直接对数组进行数学操作,无需显式循环。这就像让整个货架同时接受同一操作,而非逐个搬运货物:
result = arr_1d * 2
print("数组乘以2:", result) # 输出 [2 4 6 8 10]
another_arr = np.array([5,4,3,2,1])
sum_arr = arr_1d + another_arr
print("数组相加:", sum_arr) # 输出 [6 6 6 6 6]
NumPy进阶:广播与线性代数
广播机制:不同尺寸的数组也能和谐共处
当两个数组维度不同时,NumPy会通过广播规则自动扩展较小的数组,使其与较大数组形状匹配。这如同不同尺寸的拼图自动适配到同一画布:
a = np.array([[1], [2], [3]]) # 形状(3,1)
b = np.array([4, 5, 6]) # 形状(3,)
result = a + b # 广播后形状变为(3,3)
print("广播后结果:\n", result)
线性代数运算:矩阵计算的快捷方式
NumPy的linalg
模块提供了矩阵乘法、逆矩阵等高级功能:
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])
product = np.dot(mat1, mat2)
print("矩阵乘积:\n", product)
inv_mat = np.linalg.inv(mat1)
print("逆矩阵:\n", inv_mat)
Matplotlib基础:从数据到图形的转换
坐标系与画布:可视化的基本框架
Matplotlib的核心概念是Figure(画布)和Axes(坐标系)。可以将Figure想象为一张白纸,而Axes是纸上的坐标网格:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 1]) # 绘制折线图
plt.show()
基础图表类型:从简单到复杂
折线图:展示趋势变化
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.figure(figsize=(8,4))
plt.plot(x, y, label="正弦曲线")
plt.title("Sine Wave")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.legend()
plt.grid(True)
plt.show()
柱状图:对比离散数据
categories = ["A", "B", "C", "D"]
values = [23, 45, 12, 67]
plt.bar(categories, values, color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'])
plt.title("分类比较")
plt.show()
Matplotlib进阶:定制与复杂布局
子图:在一张画布展示多个图表
通过subplots()
函数可以创建多坐标系布局:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,4))
ax1.plot(x, np.sin(x), 'r--')
ax1.set_title("正弦曲线")
ax2.scatter(np.random.rand(50), np.random.rand(50), c='green')
ax2.set_title("随机点分布")
plt.tight_layout()
plt.show()
热力图:二维数据的密度可视化
使用imshow()
或heatmap()
函数展示矩阵数据:
data = np.random.rand(10,10)
plt.imshow(data, cmap='viridis', interpolation='nearest')
plt.colorbar()
plt.title("随机数据热力图")
plt.show()
综合案例:数据分析全流程实践
假设我们有一组销售数据,包含月份、销售额和用户增长数据:
months = np.array(['Jan','Feb','Mar','Apr','May'])
sales = np.array([245, 320, 410, 280, 390])
users = np.array([1200, 1500, 1800, 1600, 2100])
fig, ax1 = plt.subplots(figsize=(10,6))
ax1.plot(months, sales, 'b-o', label='销售额')
ax1.set_xlabel('月份')
ax1.set_ylabel('销售额(万元)', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
ax2 = ax1.twinx()
ax2.bar(months, users, alpha=0.4, color='green', label='用户数')
ax2.set_ylabel('用户数(人)', color='green')
ax2.tick_params(axis='y', labelcolor='green')
plt.title("月度销售与用户增长分析")
fig.legend(loc="upper left", bbox_to_anchor=(0.1, 0.9))
plt.show()
总结:构建属于你的数据分析工具链
通过本文的学习,您已掌握:
- NumPy的数组操作与科学计算基础
- Matplotlib的图表构建与定制技巧
- 实战案例中的多维度数据分析能力
这对工具组合如同数据科学家的"画笔与颜料",能帮助您将原始数据转化为洞见。建议在后续学习中尝试:
- 结合Pandas处理结构化数据
- 使用Seaborn进行高级可视化
- 将代码封装为可复用的函数模块
记住,实践是掌握技术的最佳途径。尝试用NumPy处理不同规模的数据集,用Matplotlib探索数据背后的故事,您将逐渐形成自己的数据思维体系。