📑 本页目录(点开跳转)
00 · 怎么用这份教程
⏱ 44 分钟 | 🧭 十三页里只有三页是必读的,剩下十页是「等你撞上那个 bug 再回来」
🎯 一句话
全站 86 页的代码里在用 NumPy,横跨 9 个板块,但没有一章在教它。
这一套只讲两件事:np.ndarray 这个数据结构本身(形状、广播、视图、内存布局、索引、dtype、随机数),
和为什么写 for 循环是错的。⭐ 不讲建模,不讲线性代数,不讲 pandas。
⏱ 先说清楚这套的章比站内其他板块长(普遍 50–120 分钟,站内其他板块的中位是 30)—— 因为每个知识点都带实跑代码和真实报错,压不下去。设计上就没打算让你一次读完: 超过 55 分钟的章在中间有 🛑 休息点,最长的几章有两个,停在那里下次接着读就行。 徽章是按 170 字/分钟实测校准的,宁可吓到你,也不骗你。
📊 一、这个洞有多大(两个 grep 口径,各撑一个论点)
⚠️ 两句都要看,只看一句都会得出错的结论。
口径一 —— 代码里真的在调它(grep -rl "numpy" --include=*.html,小写,即 import numpy / np. 调用):
86 页 / 9 个板块
| 板块 | 原统计命中页数 |
|---|---|
| 机器学习与深度学习基础 | 19 |
| 数据这一关 | 18 |
| 模型上线之后 | 16 |
| 推荐算法 | 13 |
| 机器学习的数学原理 | 11 |
| 强化学习基础 | 5 |
| AI基础设施 | 2 |
| 智能体工程教程 | 1 |
| 大模型全景导论 | 1 |
⚠️ Kaggle竞赛方法论 命中 0
md 源那一侧同理:grep -rl "import numpy" _src --include=*.md = 62 个 md / 7 个源目录
(data 18 · ops 15 · ml 13 · theory 11 · rl 3 · overview 1 · agent 1)。
口径二 —— 连正文里写作「NumPy」的也算(grep -ril,不区分大小写):87 页 / 10 个板块。
⭐ 多出来的那 1 页正是 Kaggle 竞赛方法论,而且它是那个板块唯一一次提到 NumPy:
Kaggle竞赛方法论/04:756 写「设置 Python、NumPy、PyTorch 的随机种子确保实验可复现」——
给了指令,没给机制。那一句就是第 10 章存在的全部理由。
⭐ 为什么坚持写两个数: 「86 页 / 9 个板块」撑的是「代码在用而没人教」——这是本板块的立项判据,主论点用它。 「Kaggle 那 1 页」撑的是第 10 章唯一一条最硬的证据。 💀 只写前者会让第 10 章的证据凭空消失,只写后者又夸大了「代码在用」的面。
还有一条更直白的:ML 基础 00 章的走神救援里白纸黑字写着
「前置几乎为零:numpy+sklearn」,ml_md/01 让你 pip install numpy scikit-learn ——
⭐ 承重墙板块把 NumPy 声明成了前置,而立项调研时全站 392 页没有一页教它(这正是本板块的立项理由;建成后全站 453 页)。 这一套补的就是那个前置。
⚠️ 二、两句必须先说的消歧(站内有两个同名不同物)
这不是咬文嚼字。站内已经栽过一次同名不同物的坑(《不靠数据的 AI》里的 CSP 约束满足问题, 和《密码学与信息安全》里的 CSPRNG / Cryptographic Service Provider, 按关键词 grep 会把后者误判成「已经讲过了」)。所以先钉死两个词:
| 词 | 站内别处指的是 | ⭐ 这一套里指的是 |
|---|---|---|
| 向量化 | 把文本变成 embedding 向量(智能体工程教程/11、大模型全景导论/08 等 10 处全是这个意思,NumPy 义命中 0) |
把 Python 循环改写成整块数组运算(第 01 章、第 07 章) |
| stride | 卷积核每次滑动几格(ml_md/12、ml_md/附录C 全是这个意思,内存义命中 0) |
⭐ 内存步长:在这根轴上走一格,地址要跳多少字节(第 05 章) |
⚠️ 两个词在这套教程里一律是右边那个意思,后面不再重复声明。
⛔ 三、明确不做的五件事
写在这里,免得你读到一半才发现期待落空:
| 不做 | 为什么 | 去哪 |
|---|---|---|
| pandas | 是另一个题(DataFrame / 索引对齐 / groupby 是一整套自己的语义),全站已有 16 个 md 在用它 | 本板块只讲 ndarray |
| 建模本身 | 线性回归怎么拟合、树怎么分裂,是别人的正题 | ML 基础 |
| 线性代数推导 | 特征值、SVD、条件数、PCA 的推导已经讲透了 | 数学原理 05b / 05c |
| GPU / CuPy / Numba | 换硬件是另一个层次的问题 | AI 基础设施 |
| ⭐ 计时与剖析方法论 | 「为什么取 min 不取 mean」「怎么预热」「perf_counter vs time.time」「cProfile 怎么读」是 Python 工程题,不是 NumPy 题 |
《Python》板块。本套只给倍数,不建计时小节 |
⚠️ 第五条的后果你会在第 01 章直接看到: 那一章给了一张耗时表,但不解释怎么测,只在脚注里说明口径去哪儿看。
🗺️ 四、章节地图(13 页)
| 章 | 标题 | ⏱ | 定位 |
|---|---|---|---|
| 00 | 怎么用这份教程 | 44 分钟 | 你正在读的这一页 |
| ⭐ 01 | 为什么写循环是错的 | 42 分钟 | ⭐ 必读。整套的动机,讲「快」的三层来源 |
| 02 | shape 和 axis 到底怎么数 | 48 分钟 | 换一个说法之后再也不会数错轴 |
| ⭐ 03 | 广播的三条规则 | 94 分钟 | ⭐ 必读。全站 62 个 md 都在用它,规则本身从没写出来过 |
| ⭐ 04 | 视图还是拷贝 | 106 分钟 | ⭐ 必读。「改了 A,B 也变了」这类 bug 的唯一出处 |
| 05 | 内存布局、stride 与 C/F order | 50 分钟 | 转置为什么不搬数据、.contiguous() 到底在修什么 |
| 06 | 索引的四种形态 | 88 分钟 | 切片 / 整数数组 / 布尔 / 混用,只有第一种是视图 |
| 07 | 把循环改写成数组运算:六个套路 | 66 分钟 | 手上有循环、想不出怎么改写时翻这一章 |
| 08 | 整数 dtype 的真相:回绕与截断 | 64 分钟 | 数值突然变成负的、或者正好等于 32767 时看这里 |
| 09 | log 域运算:logaddexp、logsumexp 与 log1p | 76 分钟 | 结果出 inf / nan 时看这里 |
| 10 | 随机数、种子与可复现 | 64 分钟 | 「两次跑出来不一样」和「四个 worker 抽出同样的随机数」 |
| 11 | 从 NumPy 到 PyTorch:四个语义陷阱 | 104 分钟 | 会 NumPy 之后转 torch 会踩的四个不报错的坑 |
| 附录 A | 速查(含报错对照) | 随时查,不用通读 | 「我要干这件事该用哪个函数」+ 十条报错到原因 |
⭐ 正文合计约 14.1 小时(846 分钟,不含附录)。
⚠️ 这些数字是按 170 字/分钟量出来的,不是拍脑袋写的。标少了比不标更糟 —— 你会中途弃坑,而且从此不再信这个数。
⭐ 只有 01 / 03 / 04 是必读的。 剩下的九章是查阅章 —— 它们各自对应一类具体的 bug,你撞上了再回来,比现在硬读效率高得多。 这一条就是这个板块和别的板块最大的不同,别把它当成一本需要通读的书。
🧭 五、四条读法
🎯 路线 A:只想不再写错(推荐给大多数人,约 4 小时)
操作步骤
⭐ 这三章加起来 242 分钟,覆盖了 NumPy 90% 的日常事故。 其中 04 章最值钱:它解释了「我明明只改了切片,原数组怎么也变了」这一整类 bug。
🔧 路线 B:手上正卡着一个具体问题(按症状跳,每次 50–100 分钟(章内有 🛑 断点,不用一次读完))
| 你看到的症状 | 去哪一章 |
|---|---|
operands could not be broadcast together with shapes ... |
03 |
「我只改了 b,a 怎么也变了」 |
04 |
view size is not compatible with input tensor's size and stride |
05 |
AttributeError: Incompatible shape for in-place modification |
05 |
| 累加的结果比预期小、重复下标只加了一次 | 06 |
| 「这段循环太慢了,但我想不出怎么改写」 | 07 |
| 数字突然变负、或正好是 32767 / 65535 / 2147483647 | 08 |
结果里出现 inf 或 nan |
09 |
| 「两次跑出来不一样」/「四个 worker 抽到一样的数」 | 10 |
| 从 NumPy 转 PyTorch 之后语义对不上 | 11 |
⭐ 这张表就是本板块的主入口,比从 01 章顺着读更常用。
⚡ 路线 C:想把代码改快(约 3 小时)
信息关系
⚠️ 顺序别反。不知道「为什么快」就套用第 07 章的套路, 会得到「我照抄了但没变快」——因为你抄的那一条恰好不是瓶颈。
📚 路线 D:完整走一遍(约 14 小时)
00 → 01 → … → 11 → 附录 A。适合准备面试,或者想彻底不再怕这个库。
🧩 六、每章长什么样
| 元素 | 作用 | 怎么用 |
|---|---|---|
| ⏱ 时间徽章 | 决定现在要不要开始 | 只有 15 分钟就别开 90 分钟的章 |
| 🎯 一句话 | 全章压成一句 | ⭐ 只看这一句就走,是被允许的 |
| 💻 代码 | ⭐ 每段自带 import numpy as np 并自己造数据 |
复制到空文件就能跑,不需要 GPU、不需要数据集 |
| ✅ 检查点 | 折叠答案,只考正文讲过的 | 答不上来就回去翻 |
| 🛑 可以停在这里 | 明确的退出点 | 停在这里不算失败,是设计好的 |
| ⚡ 走神救援 | ⭐ 全章压成一段,带具体数字 | 隔几天回来只读这一段就能接上 |
⭐ ⚠️ 和 💀 的区别:⚠️ 是坑(容易搞错),💀 是真会出事的后果。
⭐ 本板块的代码有一条额外规矩:每一段都自己造数据,绝不出现「我们还用刚才那个 X」。 原因很实际——这一套的代码密度是全站最高的,只要有一段依赖上一段, 你复制单块出去就是
NameError。所以你可以从任何一段开始复制。⚠️ 关于耗时数字:正文里所有「多少毫秒 / 快多少倍」都是在 Windows 11 / Python 3.13 / NumPy 2.4 / 笔记本 CPU 上实跑出来的。 ⭐ 你的绝对耗时一定会不同,看倍数和量级,别看毫秒数。 💀 这台机器有热降频,同一个脚本重跑 4 次,01 章那个倍数 在 19x 到 37x 之间摆动 —— 所以那一章给的是区间,不是一个数。
🔗 七、它和站内其他板块的关系
| 那一套 | 管什么 | 分界 |
|---|---|---|
| 机器学习与深度学习基础 | 拿 NumPy 去建模 | ⭐ 那边把 NumPy 当书写媒介,这边把它当主题。ml_md/00 声明的那个「前置」就是这一套 |
| ML 基础 附录 C · 手撕代码速查 | 十道白板题的标准写法 | ⭐ 附录 C 是「这一题怎么写」,这一套是「这个语法为什么成立」。本板块只把它那三行当例子引用(z - z.max(axis=1,keepdims=True)、grad[np.arange(n), y] -= 1.0、X[:,None,:]-C[None,:,:]),绝不重写那几道题 |
| ML 基础 附录 B · 代码速查 | 能跑的 sklearn / PyTorch 模板 | 那份表里没有「语法本身」这一格 —— 本板块的附录 A 补的就是那一格 |
| 机器学习的数学原理 | 线性代数与概率的意义 | ⭐ 那边讲条件数、SVD、PCA 的推导;这边只讲 float64 存不下的时候会发生什么 |
| AI 基础设施 | GPU、显存、混合精度 | ⭐ 05 章 和 ai_md/02 是同一个道理的两个尺度(CPU cache vs GPU HBM);08 章 只做整数,浮点低精度整块归 ai_md/06 |
| 数据这一关 | 数据进模型之前的那一半 | ⭐ 那边 07 章 把「正好等于 32767 / 65535」列为脏数据的判别信号;本板块 08 章讲的是你自己怎么制造出这种数据的 |
🚦 现在就开始
建议:先读第 01 章。
它不教任何 API,只回答一个问题:同一件事,纯 Python 一次 68 毫秒、NumPy 一次 3.5 毫秒, 这个差距到底是从哪来的。 ⭐ 答案不是「C 比 Python 快」—— 那一章会用一个 同样是 numpy、同样走 C 代码、却慢 8 倍的反例把这个说法直接推翻。
下一节 👉 01-为什么写循环是错的.md
🧭 已经知道自己卡在哪? 直接跳: 形状报错 → 03-广播的三条规则.md | 改了 A 结果 B 变了 → 04-视图还是拷贝.md | 想改快 → 07-把循环改写成数组运算.md | 出现 inf / nan → 09-log域运算.md | 报错原文对照 → 附录A-速查.md
✅ 检查点
- 这个板块的立项判据是什么?为什么要同时写「86 页 / 9 个板块」和「87 页 / 10 个板块」两个数?
- 站内说的「向量化」和这里说的「向量化」分别是什么意思?
- 站内说的「stride」和这里说的「stride」分别是什么意思?
- 明确不做的五件事是哪五件?其中「计时与剖析」为什么被排除?
- 十三页里哪三页是必读的?剩下十页该怎么用?
- 手上正卡着
operands could not be broadcast together with shapes该去哪一章?看到view size is not compatible ...呢? - 本板块的代码有一条额外规矩,是什么?为什么要立这条规矩?
- 正文里的耗时数字该怎么读?为什么 01 章给的是区间不是单点?
👀 答案
- 判据是「全站代码在用它而没有一章教它」。两个数各撑一个论点:「86 页 / 9 个板块」(
grep -rl "numpy",小写,即代码里真的在调)撑主论点「代码在用而没人教」;「87 页 / 10 个板块」(grep -ril,不区分大小写)多出来的那 1 页正是 Kaggle竞赛方法论/04:756,那是那个板块唯一一次提到 NumPy(「设置 Python、NumPy、PyTorch 的随机种子确保实验可复现」——给了指令没给机制),它是第 10 章唯一一条最硬的证据。💀 只写前者,第 10 章的证据凭空消失;只写后者,又夸大了「代码在用」的面。 - 站内别处的「向量化」是把文本变成 embedding 向量(10 处全是这个意思,NumPy 义命中 0);这里是把 Python 循环改写成整块数组运算。
- 站内别处的「stride」是卷积核每次滑动几格(内存义命中 0);这里是内存步长 —— 在这根轴上走一格,地址要跳多少字节。
- pandas(是另一个题)· 建模本身(ML 基础)· 线性代数推导(数学原理 05b/05c)· GPU / CuPy / Numba(AI 基础设施)· 计时与剖析方法论。第五条被排除是因为「为什么取 min 不取 mean」「怎么预热」「
perf_countervstime.time」是 Python 工程题不是 NumPy 题,归《Python》板块。后果是 01 章给了耗时表但不解释怎么测。 - 只有 01(为什么写循环是错的)· 03(广播)· 04(视图还是拷贝) 是必读,三章共 242 分钟,覆盖 90% 的日常事故。剩下九章是查阅章,各自对应一类具体的 bug,撞上了再回来比现在硬读效率高得多。
- 广播报错去 03 章;
view size is not compatible with input tensor's size and stride去 05 章(那是 stride 不连续造成的,05 章讲机制)。 - 规矩是「每段代码自带
import numpy as np并自己造数据,绝不出现『我们还用刚才那个 X』」。立它是因为本板块代码密度全站最高,一旦某段依赖上一段,读者复制单块出去就是NameError。好处是你可以从任何一段开始复制。 - 看倍数和量级,别看毫秒数 —— 所有数字都在 Windows 11 / Python 3.13 / NumPy 2.4 / 笔记本 CPU 上跑的,你的绝对耗时一定不同。01 章给区间是因为这台机器有热降频:同一个脚本重跑 4 次,倍数在 19x 到 37x 之间摆动,报一个单点数字就是在编数字。
🛑 可以停在这里
⚡ 走神救援
先记住这几件事
- 这里补的是数组与向量化的前置知识,不是 embedding 或建模教程。
- 先读数组、广播、视图与拷贝,再按症状进入其他章节。
- 每次动手都观察形状、内存共享和实际结果;遇到具体错误再回来查对应入口。
下一节 👉 01-为什么写循环是错的.md