个人主页杨利杰YJlio❄️个人专栏《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》《微信助手》 《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》让复杂的事情更简单让重复的工作自动化《超简单用 Python 让 Excel 飞起来》读书笔记3.4.1 数组的基础知识列表 vs NumPy 数组1. 3.4.1 数组的基础知识列表 vs NumPy 数组2. 为什么办公自动化要理解数组3. list 和 ndarray 的基本区别4. 最容易混淆的地方list * 2 和 ndarray * 25. 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 的优势在于它允许我们用更接近“批量公式”的方式写代码。只保存数据需要整列加减乘除Excel 原始列数据是否需要批量计算list 列表即可转成 NumPy ndarray向量化运算得到批量结果写回 Excel 或继续分析这个流程图可以把本节的价值说清楚列表更适合保存数据数组更适合计算数据。办公自动化里真正高频的不是单个数字计算而是一整列、一整块区域、一整张表的批量处理。推荐理解方式如果你的数据只是临时保存先用list没问题如果你要对整批数字做数学运算就应该考虑numpy.ndarray。不要把 NumPy 当成“高级语法”去背。它真正解决的是批量计算问题不是为了让代码看起来更复杂。3. list 和 ndarray 的基本区别list是 Python 内置的数据结构特点是灵活。它可以同时放数字、字符串、布尔值甚至还能放另一个列表。它的优势是通用缺点是做数学批量运算时不够直接。numpy.ndarray是 NumPy 提供的数组对象特点是更适合数值计算。它通常存放同一类数据比如一组整数、一组小数、一块二维表格。它的优势是支持向量化运算也就是一行代码对整组数据执行计算。先看最基础的创建方式# Python lista[1,2,3,4,5]# NumPy ndarrayimportnumpyasnp bnp.array([1,2,3,4,5])从表面看a和b都像是一组数字。但它们的类型完全不同。importnumpyasnp a[1,2,3]bnp.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 bnp.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 真正好用的地方是它支持向量化运算。所谓向量化不需要把这个词想得太玄它可以先粗暴理解成**不用自己写循环也能对一整组数据批量计算。**比如一组数字全部加 5importnumpyasnp bnp.array([10,20,30])print(b5)输出结果是[15 25 35]一组数字全部除以 10importnumpyasnp bnp.array([10,20,30])print(b/10)输出结果是[1. 2. 3.]一组数字全部平方importnumpyasnp bnp.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 arr2dnp.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 arr2dnp.array([[10,20,30],[40,50,60],])print(arr2d[0,1])print(arr2d[1,2])输出结果是20 60arr2d[0, 1]表示第 0 行第 1 列也就是20arr2d[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_arrnp.array(salary_list)new_salarysalary_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 arrnp.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]bnp.array([1,2,3])print(list * 2,a*2)print(ndarray * 2,b*2)print(list 类型,type(a))print(ndarray 类型,type(b))如果你能清楚解释为什么输出结果不同就说明第一层理解已经过关。再用二维数组验证shapeimportnumpyasnp arr2dnp.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 数据处理。**返回顶部