《超简单:用 Python 让 Excel 飞起来》读书笔记:3.4.1 数组的基础知识:列表 vs NumPy 数组
《超简单:用 Python 让 Excel 飞起来》读书笔记:3.4.1 数组的基础知识:列表 vs NumPy 数组
- 1. 3.4.1 数组的基础知识:列表 vs NumPy 数组
- 2. 为什么办公自动化要理解数组
- 3. list 和 ndarray 的基本区别
- 4. 最容易混淆的地方:list * 2 和 ndarray * 2
- 5. NumPy 的核心优势:向量化运算
- 6. 二维数组:把 Excel 表格放进 Python 的第一步
- 7. 二维数组如何访问元素
- 8. 从 list 到 ndarray,再到 Excel 自动化
- 9. 常见问题和踩坑提醒
- 10. 效果验证:如何确认自己真的理解了本节
- 11. 总结提升
1. 3.4.1 数组的基础知识:列表 vs NumPy 数组
V4修正版进度标记:本篇为 06月13日 第1篇,承接 06月07日第2篇“2.7.2 自定义函数”之后继续更新。
这一篇是我阅读《超简单:用 Python 让 Excel 飞起来》时整理的读书笔记,对应书籍中的第3章 Python模块 / 3.4.1 数组的基础知识。这一节开始进入NumPy,也就是 Python 数据处理里非常核心的一块内容。
刚开始学 Python 办公自动化时,很多人会先接触list,也就是列表。列表很好用,能装数字、字符串、对象,也能配合循环做很多事情。但只要进入批量计算场景,比如一列工资统一乘以 1.1、一列金额统一扣除税率、一批分数统一归一化,普通列表就会显得不够直接。
这就是NumPy的价值。NumPy的核心对象是ndarray,也就是数组。它不是为了“装东西”而生,而是为了高效计算而生。
我的理解是:list更像一个灵活的容器,什么都能放;numpy.ndarray更像一块计算板,专门用来对一组数据做批量运算。
这张图展示的是 Python 列表和 NumPy 数组的整体区别。左侧强调list的灵活性,右侧强调ndarray的数值计算能力。
从图中可以看出,列表和数组不是谁完全替代谁,而是适用场景不同。列表适合保存各种类型的数据,数组更适合处理同类型、可批量计算的数据。写 Excel 自动化时,如果只是存一组名字,用列表就够;如果要对一整列数字做运算,NumPy 数组会更自然。
2. 为什么办公自动化要理解数组
Excel 的本质就是表格。表格里有行、有列、有单元格,也有一整列可以统一套公式的场景。比如工资表里每个人的工资统一上调 10%,商品单价统一打八折,分数统一转换成百分制,这些事情如果用 Excel 手动做,就是拖公式;如果用 Python 做,就需要批量计算。
普通list当然也能完成这些任务,但往往需要循环。循环不是不能用,而是代码会更啰嗦,也更容易在真实数据里写出边界问题。NumPy 的优势在于,它允许我们用更接近“批量公式”的方式写代码。
这个流程图可以把本节的价值说清楚:列表更适合保存数据,数组更适合计算数据。办公自动化里,真正高频的不是单个数字计算,而是一整列、一整块区域、一整张表的批量处理。
推荐理解方式:如果你的数据只是临时保存,先用list没问题;如果你要对整批数字做数学运算,就应该考虑numpy.ndarray。
不要把 NumPy 当成“高级语法”去背。它真正解决的是批量计算问题,不是为了让代码看起来更复杂。
3. list 和 ndarray 的基本区别
list是 Python 内置的数据结构,特点是灵活。它可以同时放数字、字符串、布尔值,甚至还能放另一个列表。它的优势是通用,缺点是做数学批量运算时不够直接。
numpy.ndarray是 NumPy 提供的数组对象,特点是更适合数值计算。它通常存放同一类数据,比如一组整数、一组小数、一块二维表格。它的优势是支持向量化运算,也就是一行代码对整组数据执行计算。
先看最基础的创建方式:
# Python lista=[1,2,3,4,5]# NumPy ndarrayimportnumpyasnp b=np.array([1,2,3,4,5])从表面看,a和b都像是一组数字。但它们的类型完全不同。
importnumpyasnp a=[1,2,3]b=np.array([1,2,3])print(type(a))print(type(b))输出结果类似这样:
<class 'list'> <class 'numpy.ndarray'>这里要注意一点:np.array()不是简单换个名字,而是把 Python 列表转换成 NumPy 数组对象。对象变了,后面的运算行为也会跟着变。
这也是本节最重要的底层差异:同样看起来是一组数字,list和ndarray的运算规则是不一样的。
4. 最容易混淆的地方:list * 2 和 ndarray * 2
这一节真正让人“醒一下”的地方,就是* 2的差异。很多初学者会以为列表乘以 2,就是每个元素乘以 2。这个理解是错的。
先看普通列表:
a=[1,2,3]print(a*2)输出结果是:
[1, 2, 3, 1, 2, 3]这不是数学意义上的乘法,而是列表重复。也就是说,[1, 2, 3] * 2的意思是把这个列表复制两份拼在一起。
再看 NumPy 数组:
importnumpyasnp b=np.array([1,2,3])print(b*2)输出结果是:
[2 4 6]这才是逐元素计算,也就是每个元素都乘以 2。
这张图展示的是list * 2和ndarray * 2的核心区别。上方的列表乘法是复制内容,下方的数组乘法才是逐元素计算。
从图中可以看出,同样是* 2,放在不同对象上,含义完全不同。普通列表执行的是重复操作,NumPy 数组执行的是数学运算。
这是新手非常容易踩的坑:不要看到* 2就默认它一定是数学乘法。先看对象类型,是list还是numpy.ndarray。
推荐做法:如果目标是对一组数字做批量加减乘除,先确认数据已经转成np.array()。
5. NumPy 的核心优势:向量化运算
NumPy 真正好用的地方,是它支持向量化运算。所谓向量化,不需要把这个词想得太玄,它可以先粗暴理解成:**不用自己写循环,也能对一整组数据批量计算。**
比如一组数字全部加 5:
importnumpyasnp b=np.array([10,20,30])print(b+5)输出结果是:
[15 25 35]一组数字全部除以 10:
importnumpyasnp b=np.array([10,20,30])print(b/10)输出结果是:
[1. 2. 3.]一组数字全部平方:
importnumpyasnp b=np.array([10,20,30])print(b**2)输出结果是:
[100 400 900]这类写法本质上就是 Python 里的“批量公式”。你写的是一行代码,实际处理的是一整组数据。
这张图展示的是 NumPy 在 Excel 自动化场景中的批量计算价值。比如工资调整、折扣计算、税率换算,本质上都可以理解成对一列数据统一执行某个公式。
从图中可以看出,NumPy 的优势不只是语法短,而是它让我们用更接近“整列公式”的方式处理数据。Excel 里拖动公式,Python 里用数组运算,两者解决的是同一类问题。
办公自动化里非常适合用 NumPy 的场景:工资调整、金额折扣、税率换算、分数归一化、批量单位换算、整列数据校正。
但也不要滥用。如果只是处理几个字符串、几个文件名、几个路径,用普通列表就够了,没必要为了用 NumPy 而用 NumPy。
6. 二维数组:把 Excel 表格放进 Python 的第一步
办公自动化里最常见的数据结构不是一维列表,而是二维表格。Excel 本身就是二维的:横向是列,纵向是行。每一行通常是一条记录,每一列通常是一个字段。
NumPy 的二维数组就可以用来表达这种结构。比如下面这个数组:
importnumpyasnp arr2d=np.array([[1,2,3],[4,5,6],])print(arr2d)输出结果是:
[[1 2 3] [4 5 6]]这就是一个 2 行 3 列的二维数组。它看起来已经很像一个没有表头的 Excel 区域。
这张图展示的是二维数组与shape的关系。二维数组像一张表,shape=(2,3)表示 2 行 3 列。
从图中可以看出,shape是理解二维数组的关键。它告诉我们这个数组有几行几列。很多数据处理报错,本质上都和维度不匹配有关,比如你以为是 3 列,实际传进去的是 2 列。
查看数组形状可以这样写:
print(arr2d.shape)输出结果是:
(2, 3)其中第一个数字是行数,第二个数字是列数。
一句话记忆:shape看的是数组形状,二维数组里通常就是“行数、列数”。
注意:NumPy 索引从 0 开始。第 0 行不是写错,而是 Python 的索引规则。
7. 二维数组如何访问元素
理解二维数组后,还要知道怎么访问里面的某个值。NumPy 的二维数组通常用arr[行, 列]的方式访问元素。
例如:
importnumpyasnp arr2d=np.array([[10,20,30],[40,50,60],])print(arr2d[0,1])print(arr2d[1,2])输出结果是:
20 60arr2d[0, 1]表示第 0 行第 1 列,也就是20;arr2d[1, 2]表示第 1 行第 2 列,也就是60。
推荐理解方式:先行后列,索引从 0 开始。这个规则记住后,二维数组的定位就不难。
如果把它和 Excel 类比,可以理解成“先找第几行,再找第几列”。只是 Excel 界面通常从第 1 行、第 A 列开始显示,而 Python 索引从 0 开始,这一点容易让新手错一位。
常见错误:把第 1 行误写成索引 1。实际上索引 1 是第二行。初学时建议多打印几次结果,不要靠感觉猜。
print("第0行第0列:",arr2d[0,0])print("第0行第1列:",arr2d[0,1])print("第1行第0列:",arr2d[1,0])这种打印方式虽然笨,但非常适合初学阶段建立位置感。尤其是后面处理 Excel 区域、DataFrame、矩阵数据时,行列索引搞错会直接导致结果错位。
8. 从 list 到 ndarray,再到 Excel 自动化
学 NumPy 不应该只停在“会创建数组”。它真正的用法,是把原始数据转换成数组,进行批量计算,然后再把结果写回 Excel 或继续交给pandas分析。
例如有一列原始工资:
salary_list=[5000,6000,7000]如果要统一上调 10%,可以先转成 NumPy 数组:
importnumpyasnp salary_list=[5000,6000,7000]salary_arr=np.array(salary_list)new_salary=salary_arr*1.1print(new_salary)输出结果类似:
[5500. 6600. 7700.]如果后面要写回 Excel,可以把结果继续交给pandas或openpyxl处理。这里先不用急着把所有库混在一起,先理解数据处理链路就够了。
这张图展示的是从list到ndarray,再到批量运算,最后写回 Excel 或继续分析的完整流程。
从图中可以看出,NumPy 更像是数据处理链路中的计算引擎。原始数据可以来自列表、Excel、CSV,也可以来自数据库;转成数组后,就可以进行批量计算;计算完成后,再把结果写回文件或继续分析。
这才是 NumPy 在办公自动化里的真实位置:它不是为了替代 Excel,而是为了让 Python 更高效地处理 Excel 里的批量数字计算。
9. 常见问题和踩坑提醒
第一个常见问题是:为什么列表乘以 2 不是每个元素乘以 2?因为list的乘法规则是重复列表,不是数学逐元素计算。如果你要对每个元素做数学运算,就应该用循环,或者先转换成 NumPy 数组。
a=[1,2,3]print(a*2)输出结果是:
[1, 2, 3, 1, 2, 3]第二个常见问题是:为什么 NumPy 数组里最好是同类型数据?因为 NumPy 的优势来自高效数值计算。如果一个数组里混入字符串、对象、空值,很多数学运算就会变得不稳定,甚至直接报错。
风险提醒:不要把 Excel 中混杂了文字、空白、异常字符的列直接当成纯数字数组计算。真实办公数据通常先要清洗,再计算。
第三个常见问题是:为什么二维数组报错说维度不匹配?这通常和shape有关。你以为数据是 2 行 3 列,但代码需要的是 3 行 2 列,或者某个操作要求两个数组形状一致。
importnumpyasnp arr=np.array([[1,2,3],[4,5,6],])print(arr.shape)输出结果是:
(2, 3)推荐做法:只要涉及二维数组、矩阵计算、批量写入表格,都先打印一次shape,确认行列是否和预期一致。
第四个常见问题是:学了 NumPy 后是不是就不用列表了?不是。列表仍然很重要。文件名列表、路径列表、员工姓名列表、Sheet 名称列表,这些场景用列表就很自然。NumPy 适合的是数值计算,不是所有数据都要转数组。
一句话判断:保存杂数据用list,批量算数字用ndarray。
10. 效果验证:如何确认自己真的理解了本节
这一节不能只看“代码跑通了”。因为列表和数组的差异,很多时候不是语法问题,而是对象行为问题。你必须能解释同一段运算为什么在list和ndarray上结果不同。
我建议用下面这段小代码做验证:
importnumpyasnp a=[1,2,3]b=np.array([1,2,3])print("list * 2:",a*2)print("ndarray * 2:",b*2)print("list 类型:",type(a))print("ndarray 类型:",type(b))如果你能清楚解释为什么输出结果不同,就说明第一层理解已经过关。
再用二维数组验证shape:
importnumpyasnp arr2d=np.array([[10,20,30],[40,50,60],])print("数组内容:")print(arr2d)print("数组形状:",arr2d.shape)print("第0行第1列:",arr2d[0,1])print("第1行第2列:",arr2d[1,2])这段代码至少要能验证三件事:第一,数组是 2 行 3 列;第二,索引从 0 开始;第三,访问元素时是先写行,再写列。
学习建议:不要只复制代码。每次运行后都要先看输出,再用自己的话解释输出为什么是这样。
如果解释不了输出结果,说明还只是“会跑代码”,不是“理解数组”。
11. 总结提升
这一节的核心,是理解 Python 列表和 NumPy 数组的差异。列表是通用容器,灵活但不专门为数学运算设计;NumPy 数组是数值计算工具,适合对一组数据做批量计算。
最关键的例子就是* 2。列表乘以 2 是复制列表,数组乘以 2 是每个元素乘以 2。这个差异看似小,但足以说明两者的设计目标完全不同。
二维数组则让我们开始把 Excel 表格映射到 Python 世界里。shape告诉我们数组的行列结构,arr[行, 列]帮我们定位具体元素。后面学习pandas、数据分析、批量写回 Excel 时,这些基础都会继续用到。
我的最终理解是:NumPy 不是为了让 Python 看起来更高级,而是为了让 Python 能像 Excel 公式一样,对整列、整块、整张表的数据进行批量计算。
后续写办公自动化脚本时,如果遇到整列数字统一计算、批量换算、矩阵式数据处理,就可以优先考虑 NumPy。
但也要记住:真实 Excel 数据往往不干净,做 NumPy 运算前,仍然要先检查空值、文本、异常字符和数据类型。
我最后把本节压缩成一句话:**列表负责装数据,数组负责算数据;理解这个差异,才算真正走进 Python 数据处理。**
返回顶部
