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的图表构建与定制技巧
  • 实战案例中的多维度数据分析能力

这对工具组合如同数据科学家的"画笔与颜料",能帮助您将原始数据转化为洞见。建议在后续学习中尝试:

  1. 结合Pandas处理结构化数据
  2. 使用Seaborn进行高级可视化
  3. 将代码封装为可复用的函数模块

记住,实践是掌握技术的最佳途径。尝试用NumPy处理不同规模的数据集,用Matplotlib探索数据背后的故事,您将逐渐形成自己的数据思维体系。

最新发布