NumPy 是 Python 科学计算中最常用的核心库。它可以提供一系列高性能的多维数组对象,以及用于这些数组的工具。【划重点:数组接口是 Numpy 最重要的特性,没有之一。】这篇教程以练代教,通过实操掌握知识点的学习,确保大家能实际应用所学的编程知识。毕竟,Practice Makes Perfect。
为什么学习 Python 绕不开 Numpy?
把 NumPy 看起来可爱逗趣的名字拆开,人家其实非常正经。NumPy 即 Numerical Python(数字化 Python)的缩写。简单来说,NumPy 是 Python 中的线性代数库,这就明示了 NumPy 在 Python 中的重要性了。
之所以说 NumPy 是 Python 中最常用也是最重要的核心库,是因为许多类似 SciPy、Matplotlib、Scikit-learn、TensorFlow 等,都对 NumPy 有一定程度的依赖。例如,TensorFlow 会在内部使用 Numpy 来处理 Tensors 中的多项操作。 在处理数据科学或机器学习的过程中,NumPy 可以对数组提供数学和逻辑运算,同时也在 Python 中对 n 数组和矩阵操作提供各种不同的功能。 NumPy对于对数组进行数学和逻辑运算非常有用。它为Python中对n个数组和矩阵的操作提供了大量有用的功能。简单易用的 NumPy 可以简化复杂的数学实现,让编程概念变得更为数字化且易于理解,因此也广泛使用于各种开源项目中。
如何开始使用 NumPy?
在 Python IDE 中使用教程的配套源代码学习 NumPy,只需要通过 QuickFix 就可以一键安装。更多关于 NumPy 模块的安装方式,可以查看如何手动下载和安装依赖。
【源码传送门】https://d1590a0dfb-share.lightly.teamcode.com
NumPy 跟练 1:修改学科成绩曲线
前面曾提到数组是 NumPy 最核心的功能,也是最重要的特性。因此,第一阶段的跟练内容就是使用 numpy.array() 创建数组,然后通过 NumPy 内建的函数修改并计算数组中的内容。
场景说明
假设你是一名大学教师,你在最近的期末考中失手出了巨难的考题,因此学生的成绩都不太理想。虽然如此,你很善良,不忍心大量学生因此挂科,所以你决定修改学科成绩曲线,让大家的分数看起来合理一些。
你初次批改的卷面分分别为:[42, 35, 64, 85, 51, 72, 59, 12] 这么一看,8 个人就有 5 个挂,着实有点狠了。
解题
我们把这个分数用 numpy.array() 导入,即numpy.array([42, 35, 64, 85, 51, 72, 59, 12])。若使用 import numpy as np,则应在代码中把 numpy.array() 改为 np.array()。【注意:.array() 的括号内需要再添加方括号。】
NumPy 中的数组会将数据元素储存于毗邻的储存位置中,通过索引号直接访问。这里的数组为一维数组,随着深入学习,我们慢慢还会接触二维数组 …… N 维数组等等。
【查看源码】https://d1590a0dfb-share.lightly.teamcode.com
如果不使用 NumPy 处理成绩曲线,我们需要重复为各个分数进行加分后,再进行合计。NumPy 把这些数据组合成数组后,便可以对这些数据进行统一处理,不仅去相对掉繁琐的 for 循环,让代码看起来更简洁明了,更减少了代码出现 bug 的概率。一般上,这个过程被称之为矢量化(vectorization)。
在这段代码中,我们主要应用了 NumPy 中自建的 .mean() 函数以及 .clip() 函数。前者即平均数(mean)的函数,简单易懂。.clip() 函数则确保数组中的值不超过给定的上下限,clip 的意思是“修剪”,所以应用到代码中为:
numpy.clip(需要修剪的变量, 下限, 上限)
在修改分数曲线时,我们需要修剪的变量为 new_grades,下限设置为不低于原先的分数(否则还被降分的学生也太惨了),然后把上限设置为 100 分。毕竟,百分制的话 100 分就是上限了。如此一来,直接使用老传统 print() 进行打印,新的分数就出来了。
刚开始使用 NumPy 其实不太需要担心各种各样的函数眼花缭乱,也不需要担心自己需要死背这些内容,拥抱各类模块的文档(documentation)就可以快速理解模块中的各种函数功能。所以,这类的文档有时候也被称之为小抄(cheatsheet)或食谱(cookbook)。也就是说,合格的程序员必须要学会查找和阅读 NumPy 的官方文档。
NumPy 跟练 2:检索学生班级与成绩
上一个跟练的内容为一维数组,这次我们来看看 NumPy 如何处理多维数组中的数据。
场景说明
因为批改大学的试卷太难了,你选择退而求其次,考了教师资格证成为高中体育老师。这一次,我们要用 NumPy 分别记录学生的姓名、班级和成绩。
在这次的场景中,我们将应用 NumPy 中的记录数组(又称之为结构化数组)。这类数组可以为每一列指定数据类别(例如:str 字符串、int 整数、bool 布尔运算等)和名称,让数据筛选变得更简单强大。 我们来看看数据原材料:
data = np.array([("丁一", 1, 87),
("刘二", 2, 68),
("张三", 3, 72),
("李四", 3, 55),
("王五", 3, 93),
("赵六", 2, 81),
("孙七", 1, 75),
("周八", 1, 88),
("吴九", 2, 64),
("郑十", 2, 49),
], dtype=[("姓名", str), ("班级", int), ("分数", int)])
这一看除了把名字排得特别整齐,其他班级和分数不是乱七八糟嘛 …… 这不我们还得把学生按班级整理好,高分的同学该表扬,低分的同学该批评一下嘛?
练习
上一个跟练我们直接给了标准答案,这一次还是需要大家自己动手尝试。放心,该有的提示和讲解还是会有,但检查答案前还是需要大家思考一下以下的题目:
# 已知data[0] 的输出为 ("丁一", 1, 87)
data["姓名"] 的输出为 ['丁一' '刘二' '张三' ...]
data[data["分数"] > 59]["姓名"] 的输出为 ['丁一' '刘二' '张三' '王五' '赵六' '孙七' '周八' '吴九']
使用 data[] 函数,求:
同学们可以另开新档尝试自己手动做题,再查看源代码中的 score2D.py 参考答案,在线查看并运行项目:https://d1590a0dfb-share.lightly.teamcode.com
最后的最后,无论是学习编程或其他内容,只有练习、练习再练习才能在知识基础上更进一步。欢迎查看源码中的扩展练习与答案以及往期 Python 教程: 怎么看待 Python(PyScript) 可以做浏览器前端开发语言?
使用 Python Turtle 制作贪吃蛇游戏
学习 Python 爬虫,手把手通过 Python 入门爬取网页信息