欢迎光临
我们一直在努力

《超简单:用 Python 让 Excel 飞起来》读书笔记:3.4.2 数组的创建:np.array、np.arange、随机数与 reshape

avatar

🔥
个人主页:
杨利杰YJlio

❄️
个人专栏:
《Sysinternals实战教程》
《Windows PowerShell 实战》
《WINDOWS教程》
《IOS教程》

《微信助手》
《锤子助手》
《Python》
《Kali Linux》

《那些年未解决的Windows疑难杂症》
🌟
让复杂的事情更简单,让重复的工作自动化

请添加图片描述

在这里插入图片描述


《超简单:用 Python 让 Excel 飞起来》读书笔记:3.4.2 数组的创建:np.array、np.arange、随机数与 reshape

  • 1. 写在前面:为什么办公自动化要先学会创建数组
  • 2. np.array():把 list 变成真正适合计算的数组
  • 3. np.arange():快速生成连续数字序列
    • 3.1 一个参数:np.arange(stop)
    • 3.2 两个参数:np.arange(start, stop)
    • 3.3 三个参数:np.arange(start, stop, step)
  • 4. reshape():把一维序列变成二维表格
  • 5. np.random.randn():生成正态分布随机数
  • 6. np.random.randint():生成更像业务数据的随机整数表
  • 7. 快速生成一张可以写入 Excel 的测试表
  • 8. 常见问题与踩坑提醒
    • 8.1 np.arange() 为什么不包含 stop
    • 8.2 reshape() 为什么会报错
    • 8.3 randint() 的 high 为什么不包含
    • 8.4 随机数每次都变,教程截图对不上怎么办
    • 8.5 二维数组写入 Excel 时为什么位置不对
  • 9. 我的总结:数组创建是 Excel 自动化的数据准备层

1号标题图

1. 写在前面:为什么办公自动化要先学会创建数组

V4修正版进度标记:本篇为 06月13日 第2篇,承接 06月07日第2篇“2.7.2 自定义函数”之后继续更新。

  本文是我阅读《超简单:用 Python 让 Excel 飞起来》时整理的读书笔记,对应书中第 3 章 Python 模块里的 3.4.2 数组的创建。这一节看起来是在讲 NumPy 的基础函数,但如果放到 Excel 自动化场景里看,它其实是在解决一个非常实际的问题:怎样快速准备一批可以计算、可以变形、可以写入 Excel 的数据。

  很多人刚开始学 Python 办公自动化时,会直接从 Excel 读写开始。但真正处理数据时,你迟早会遇到这些需求:把已有列表转成可计算的数组,快速生成一列序号,造一组测试数据,生成一个二维表格,再把它写入 Excel 工作表。

  NumPy 数组的价值,不是“比列表高级”,而是它更适合做批量计算、表格型数据组织和测试数据生成。如果后面要继续学习 pandas、xlwings、批量报表,这一节就是底层铺垫。

  这张图展示的是本篇文章的整体主题:通过 np.array()、np.arange()、随机数函数和 reshape() 创建不同形态的 NumPy 数组,并服务于 Excel 自动化处理。

请添加图片描述

  从图中可以看出,数组创建并不是一个孤立语法点。它连接了几个常见办公场景:已有数据转数组、生成连续序号、生成随机测试数据、把一维数据整理成二维表格。最后这些数据都可以继续进入 Excel 写入、统计分析和报表生成流程。

  我建议把这一节理解成“造数据”和“整理数据形状”的基础课。只要把数组创建方式掌握清楚,后面再看 pandas 的 DataFrame,就不会觉得表格数据是突然冒出来的。

#mermaid-svg-iawHMtKQDN7DsIEd{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iawHMtKQDN7DsIEd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iawHMtKQDN7DsIEd .error-icon{fill:#552222;}#mermaid-svg-iawHMtKQDN7DsIEd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iawHMtKQDN7DsIEd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iawHMtKQDN7DsIEd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iawHMtKQDN7DsIEd .marker.cross{stroke:#333333;}#mermaid-svg-iawHMtKQDN7DsIEd svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iawHMtKQDN7DsIEd p{margin:0;}#mermaid-svg-iawHMtKQDN7DsIEd .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-iawHMtKQDN7DsIEd .cluster-label text{fill:#333;}#mermaid-svg-iawHMtKQDN7DsIEd .cluster-label span{color:#333;}#mermaid-svg-iawHMtKQDN7DsIEd .cluster-label span p{background-color:transparent;}#mermaid-svg-iawHMtKQDN7DsIEd .label text,#mermaid-svg-iawHMtKQDN7DsIEd span{fill:#333;color:#333;}#mermaid-svg-iawHMtKQDN7DsIEd .node rect,#mermaid-svg-iawHMtKQDN7DsIEd .node circle,#mermaid-svg-iawHMtKQDN7DsIEd .node ellipse,#mermaid-svg-iawHMtKQDN7DsIEd .node polygon,#mermaid-svg-iawHMtKQDN7DsIEd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iawHMtKQDN7DsIEd .rough-node .label text,#mermaid-svg-iawHMtKQDN7DsIEd .node .label text,#mermaid-svg-iawHMtKQDN7DsIEd .image-shape .label,#mermaid-svg-iawHMtKQDN7DsIEd .icon-shape .label{text-anchor:middle;}#mermaid-svg-iawHMtKQDN7DsIEd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iawHMtKQDN7DsIEd .rough-node .label,#mermaid-svg-iawHMtKQDN7DsIEd .node .label,#mermaid-svg-iawHMtKQDN7DsIEd .image-shape .label,#mermaid-svg-iawHMtKQDN7DsIEd .icon-shape .label{text-align:center;}#mermaid-svg-iawHMtKQDN7DsIEd .node.clickable{cursor:pointer;}#mermaid-svg-iawHMtKQDN7DsIEd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iawHMtKQDN7DsIEd .arrowheadPath{fill:#333333;}#mermaid-svg-iawHMtKQDN7DsIEd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iawHMtKQDN7DsIEd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iawHMtKQDN7DsIEd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iawHMtKQDN7DsIEd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iawHMtKQDN7DsIEd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iawHMtKQDN7DsIEd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iawHMtKQDN7DsIEd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iawHMtKQDN7DsIEd .cluster text{fill:#333;}#mermaid-svg-iawHMtKQDN7DsIEd .cluster span{color:#333;}#mermaid-svg-iawHMtKQDN7DsIEd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iawHMtKQDN7DsIEd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iawHMtKQDN7DsIEd rect.text{fill:none;stroke-width:0;}#mermaid-svg-iawHMtKQDN7DsIEd .icon-shape,#mermaid-svg-iawHMtKQDN7DsIEd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iawHMtKQDN7DsIEd .icon-shape p,#mermaid-svg-iawHMtKQDN7DsIEd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iawHMtKQDN7DsIEd .icon-shape .label rect,#mermaid-svg-iawHMtKQDN7DsIEd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iawHMtKQDN7DsIEd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iawHMtKQDN7DsIEd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iawHMtKQDN7DsIEd :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

已有 list / 二维 list

np.array 转成 ndarray

需要连续序列

np.arange 生成序列

reshape 转成二维表格

需要模拟数据

randn / randint 生成随机数组

批量计算 / 清洗 / 统计

写入 Excel / 生成测试表 / 输出报表

  这张流程图可以先帮我们建立主线:数组创建不是为了“会背函数”,而是为了给后续数据处理准备结构化数据。

2号标题图

2. np.array():把 list 变成真正适合计算的数组

  np.array() 是创建 NumPy 数组最基础、也最容易理解的方法。它的作用是把 Python 原生的列表转换成 NumPy 的 ndarray。

  先看一维列表转数组:

import numpy as np

a = np.array([1, 2, 3, 4, 5])

print(a)
print(type(a))

  输出结果类似这样:

[1 2 3 4 5]
<class 'numpy.ndarray'>

  这里最关键的变化是:原来的 Python 列表被转换成了 NumPy 数组。表面上看,输出内容仍然是 1、2、3、4、5,但底层对象已经不一样了。

  列表更像普通容器,数组更适合做批量计算。比如你想对一组数整体加 10、乘 2、求平均值,NumPy 数组会更自然。

  这张图展示的是 np.array() 的核心作用:把一维列表或二维列表转换成 NumPy 数组。

请添加图片描述

  从图中可以看出,一维列表转换后对应一维数组,二维列表转换后则很像 Excel 中的一块单元格区域。对办公自动化来说,二维数组更接近真实表格数据。

  再看二维列表转二维数组:

import numpy as np

b = np.array([
[1, 2, 3],
[4, 5, 6]
])

print(b)
print(b.shape)

  输出结果类似这样:

[[1 2 3]
[4 5 6]]
(2, 3)

  b.shape 返回的是数组形状,这里 (2, 3) 表示 2 行 3 列。这个概念和 Excel 表格非常接近:你可以把它理解成一个 2 行 3 列的数据区域。

  在 Excel 自动化场景里,二维数组尤其重要。因为不管是后续写入工作表,还是进行批量统计,表格数据通常都是行列结构。

  需要注意的是,二维列表每一行的长度最好保持一致。如果每一行长度不一样,数组结构就会变得不规整,后面做计算和写入 Excel 时很容易出问题。

3号标题图

3. np.arange():快速生成连续数字序列

  np.arange() 可以理解成 NumPy 里的“自动生成数字序列”工具。它和 Python 自带的 range() 很像,但返回的是 NumPy 数组。

  np.arange() 常见有三种写法:1 个参数、2 个参数、3 个参数。

3.1 一个参数:np.arange(stop)

  一个参数时,从 0 开始,到 stop – 1 结束。

import numpy as np

a = np.arange(5)
print(a)

  输出结果:

[0 1 2 3 4]

  注意这里不会包含 5。这就是常说的“左闭右开”。

3.2 两个参数:np.arange(start, stop)

  两个参数时,从 start 开始,到 stop – 1 结束。

import numpy as np

a = np.arange(3, 8)
print(a)

  输出结果:

[3 4 5 6 7]

3.3 三个参数:np.arange(start, stop, step)

  三个参数时,第三个参数 step 表示步长。

import numpy as np

a = np.arange(0, 10, 2)
print(a)

  输出结果:

[0 2 4 6 8]

  np.arange(start, stop, step) 的核心规则是:从 start 开始,每次增加 step,但不会包含 stop。

  这张图展示的是 np.arange() 和 reshape() 的组合逻辑:先生成一维连续序列,再把它变成二维表格。

请添加图片描述

  从图中可以看出,np.arange() 更适合生成连续数字,比如序号、月份编号、分段区间、模拟行号等;而 reshape() 可以把这些连续数字重新整理成表格结构。

  在办公自动化里,np.arange() 很适合快速生成测试序号、行号、月份序列和分组编号。这比手动写列表更省事,也更容易调整。

4号标题图

4. reshape():把一维序列变成二维表格

  reshape() 的作用是改变数组形状。最常见的用法,就是把一维数组变成二维数组。

  比如我们先生成 0 到 11 共 12 个数字:

import numpy as np

a = np.arange(12)
print(a)

  输出结果是一个一维数组:

[ 0 1 2 3 4 5 6 7 8 9 10 11]

  接下来用 reshape(3, 4) 把它变成 3 行 4 列:

import numpy as np

a = np.arange(12)
b = a.reshape(3, 4)

print(b)
print(b.shape)

  输出结果:

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
(3, 4)

  这一步非常像把一列数据重新排成 Excel 中的一块区域。原本只是一串数字,经过 reshape() 后,就有了行和列。

  不过 reshape() 有一个硬规则:变形前后的元素总数必须一致。

  比如 np.arange(12) 有 12 个元素,可以变成 3 × 4,也可以变成 2 × 6,因为元素总数都是 12。

import numpy as np

a = np.arange(12)

print(a.reshape(3, 4))
print(a.reshape(2, 6))

  但如果你这样写,就会报错:

import numpy as np

a = np.arange(10)
b = a.reshape(3, 4)

  原因很简单:np.arange(10) 只有 10 个元素,而 3 × 4 需要 12 个元素。

  记忆方式很简单:行数 × 列数 = 元素总数。只要这个等式不成立,reshape() 就不应该强行写。

5号标题图

5. np.random.randn():生成正态分布随机数

  除了已有数据和连续序列,办公自动化里还有一个常见需求:快速生成测试数据。比如我想先模拟一批销量波动、误差数据、测量数据,用来验证脚本逻辑和报表格式。

  np.random.randn() 用来生成符合标准正态分布的随机数。简单理解,它生成的是一批围绕 0 上下波动的小数。

  生成一个随机数:

import numpy as np

x = np.random.randn()
print(x)

  生成一维随机数组:

import numpy as np

a = np.random.randn(5)
print(a)

  生成二维随机数组:

import numpy as np

b = np.random.randn(3, 4)

print(b)
print(b.shape)

  randn() 更适合模拟带波动的小数数据。比如误差、增长率、变化幅度、测量偏差等。

  这张图展示的是 NumPy 随机数创建方式,包括 np.random.randn() 生成正态分布随机数,以及 np.random.randint() 生成随机整数数组。

请添加图片描述

  从图中可以看出,randn() 更偏模拟“波动型数据”,而 randint() 更像真实办公中的整数数据,例如成绩、库存、销量、数量。两者都可以用来生成测试表,但适用场景不同。

  随机数每次运行通常都会变化。如果你写博客、写教程、做测试,需要让结果可复现,可以考虑设置随机种子。

import numpy as np

np.random.seed(0)

a = np.random.randn(5)
print(a)

  设置随机种子后,同样的代码多次运行会得到一致的随机结果,更适合写教程和做演示。

6号标题图

6. np.random.randint():生成更像业务数据的随机整数表

  如果我们想模拟成绩、库存、销量、数量这类数据,通常不需要小数,而是需要整数。这时候就更适合使用 np.random.randint()。

  它的基本写法是:

np.random.randint(low, high, size=...)

  其中,low 表示最小值,包含在结果里;high 表示最大值,但不包含;size 表示生成数组的形状。

  比如生成一个 3 行 4 列、范围在 0 到 9 之间的随机整数表:

import numpy as np

arr = np.random.randint(0, 10, size=(3, 4))

print(arr)
print(arr.shape)

  输出结果每次可能不同,例如:

[[3 9 1 0]
[7 2 5 8]
[6 4 4 1]]
(3, 4)

  这里的 size=(3, 4) 就表示生成 3 行 4 列。这和 Excel 表格区域很像,所以它非常适合用来造一块测试数据。

  如果要模拟 5 行 3 列、范围在 0 到 100 之间的成绩或销量,可以这样写:

import numpy as np

data = np.random.randint(0, 101, size=(5, 3))

print(data)

  这种写法很适合在还没有真实业务数据时,先验证脚本结构、Excel 写入逻辑和报表样式。

  注意 high 不包含在结果中。如果你想生成 0 到 100 之间的整数,应该写 np.random.randint(0, 101),而不是 np.random.randint(0, 100)。

7号标题图

7. 快速生成一张可以写入 Excel 的测试表

  前面分别讲了 np.array()、np.arange()、reshape() 和随机数函数。现在可以把它们放到 Excel 自动化场景里看:我们先生成数据,再把数据写入 Excel。

  下面这段代码生成 5 行 3 列、范围在 0 到 100 的随机整数数据:

import numpy as np

data = np.random.randint(0, 101, size=(5, 3))

print(data)
print(data.shape)

  如果后续配合 xlwings,就可以把这块数据一次性写入 Excel:

import numpy as np
import xlwings as xw

data = np.random.randint(0, 101, size=(5, 3))

app = xw.App(visible=True)
wb = app.books.add()
sht = wb.sheets[0]

sht.range("A1").value = data

  这张图展示的是 NumPy 创建测试表并写入 Excel 的完整链路:先创建数组,再调整形状,最后写入 Excel 工作表。

请添加图片描述

  从图中可以看出,NumPy 数组不是停留在控制台里打印结果,而是可以继续进入 Excel 自动化流程。只要数组是二维结构,就很容易对应到 Excel 的一块单元格区域。

  这也是我认为本节最重要的价值:数组创建是后续 Excel 写入、测试报表、模拟数据分析的前置动作。

  如果只是学习 NumPy,可能会觉得这些函数有点零散;但一旦放到 Excel 场景里,它们就串成了一条很清楚的路线:造数据 → 整形状 → 写表格 → 验证结果。

8号标题图

8. 常见问题与踩坑提醒

8.1 np.arange() 为什么不包含 stop

  np.arange() 和 Python 的 range() 一样,遵循左闭右开的规则。比如 np.arange(5) 得到的是 0、1、2、3、4,不会包含 5。

  这个规则在生成序号、分组区间时很有用。只要记住“不包含 stop”,就不容易写错边界。

8.2 reshape() 为什么会报错

  reshape() 报错最常见的原因是元素总数不匹配。比如 10 个元素不能变成 3 行 4 列,因为 3 × 4 = 12。

  写 reshape() 前必须先确认元素总数。不要只看想要几行几列,还要看原数组里到底有多少个元素。

8.3 randint() 的 high 为什么不包含

  np.random.randint(low, high) 中的 high 不包含在结果里。如果想生成 1 到 100 之间的随机整数,应该写:

import numpy as np

data = np.random.randint(1, 101, size=(5, 3))
print(data)

  如果写成 np.random.randint(1, 100),最大只可能生成到 99。

8.4 随机数每次都变,教程截图对不上怎么办

  这是正常现象。随机数函数每次运行都会生成不同结果。如果希望教程截图、运行结果、读者复现保持一致,可以设置随机种子。

import numpy as np

np.random.seed(42)

data = np.random.randint(0, 101, size=(5, 3))
print(data)

  写教程时建议设置随机种子,做真实模拟时则根据需要决定是否固定。

8.5 二维数组写入 Excel 时为什么位置不对

  如果用 xlwings 写入二维数组,要确认起始单元格是否正确。例如 sht.range("A1").value = data 会从 A1 开始写入。如果你希望从 B2 开始,就要改成 sht.range("B2").value = data。

  NumPy 负责生成数据,Excel 写入库负责决定写到哪里。这两个边界要分清楚。

9号标题图

9. 我的总结:数组创建是 Excel 自动化的数据准备层

  这一节我最后记住的,不是单纯的几个函数名,而是 NumPy 在 Excel 自动化中的位置。

  Excel 自动化不是一上来就读写表格,很多时候需要先准备数据、模拟数据、整理数据形状。而 np.array()、np.arange()、reshape()、randn() 和 randint() 正好解决了这几个前置问题。

  本篇最核心的几个结论是:

  第一,np.array() 可以把 list 或二维 list 转成 NumPy 数组。

  第二,np.arange() 适合生成连续数字序列,常用于序号、行号、分段区间。

  第三,reshape() 可以把一维数组整理成二维表格,但元素总数必须一致。

  第四,np.random.randn() 适合生成波动型小数,np.random.randint() 更适合生成业务感更强的整数表。

  如果把这些数组创建方法练熟,后面学习 pandas 和 xlwings 会顺很多。因为你已经知道数据可以从哪里来、可以是什么形状、可以怎样变成 Excel 能接收的二维表格。

  对我来说,这一节真正有价值的地方,是把“创建数组”从语法记忆变成了办公自动化里的数据准备思路。以后不管是做测试表、模拟销量,还是批量写入 Excel,都可以从这些基础方法开始搭建。


请添加图片描述

🔝 返回顶部

点击回到顶部

赞(0)
未经允许不得转载:171主机测评 » 《超简单:用 Python 让 Excel 飞起来》读书笔记:3.4.2 数组的创建:np.array、np.arange、随机数与 reshape
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址