3-2 NumPy数据的变形与定位
📌 一、 课程导入(10 分钟)
- 复习抽测(5分钟)
- 提问:如何从 $100 \times 4$ 的数据集
data中切片提取出特征集 $X$ 和标签 $y$? - 学生回答:
X = data[:, :-1],y = data[:, -1]。
- 提问:如何从 $100 \times 4$ 的数据集
- 场景引入:遇到机器学习常见的“维度报错”
- 场景 1:图片是 $28 \times 28$ 的二维方格,但神经网络模型只接受一维的 784 个像素特征值。
- 场景 2:使用单特征预测房价(只有一个特征“面积”),把一维数组
[85, 120, 60]直接传给scikit-learn算法模型时,系统抛出报错:Expected 2D array, got 1D array instead。 - 引入课题:如何自由操控数据的“形态”,以及如何在多维度中“精准定位”?
- 👨🏫 教师活动:在 Jupyter 中演示将一维数组传给算法库时的报错提示,让学生看懂
Expected 2D array的关键信息。 - 🧑🎓 学生活动:观察报错日志,体会“数据总数没变,但数据形态不对”引发的问题,产生解决问题的需求。
以真实报错作为问题驱动,避免枯燥的语法讲解,直接将“形态变换”与机器学习算法的强依赖性绑定,提升学习针对性。
📖 二、 解决问题过程(一):数据的“变形术” reshape(30 分钟)
- 查看形状
shape属性arr.shape返回元组,代表各维度的大小。例如(100, 4)表示 100 行 4 列。
- 形态变换
reshape()核心法则- 守恒定律:变换前后,数组的元素总个数必须保持一致!(如 12 个元素可转为 $3\times 4$、$4\times 3$、$2\times 6$,但不能转为 $3\times 5$)。
- 关键技巧:
-1自动推导维度- 告诉 NumPy:“其中某一维我懒得算,由你根据总数自动计算”。
- 示例:12 个元素,
arr.reshape(3, -1)$\rightarrow$ NumPy 自动推导列数为 4。
- 避坑必会:
reshape(-1, 1)与 展平 (flatten)reshape(-1, 1):把一维行向量(shape: (N,))转换为二维列向量(shape: (N, 1)),专门解决算法库的“2D 期望报错”。flatten()/ravel():将多维数据拉直为一维数组(如把 $28 \times 28$ 图像拉直为 784 维向量)。
- 👨🏫 教师活动:用积木比喻解释数据排列:12 块积木摆成一条线(1D)或摆成 3 行 4 列(2D),总量不变。现场演示
-1参数的推导过程。 - 🧑🎓 学生活动:在 Jupyter 中敲击
reshape代码,故意输入无法整除的形状(如将 12 个元素 reshape(3, 5))观察报错信息,加深“元素守恒”印象。
突破 -1 自动计算的理解难点,帮助学生彻底搞懂一维 (N,) 与二维列向量 (N, 1) 的形态差异,打通后续 machine learning 模型调包的障碍。
💻 三、 解决问题过程(二):数据的“定位器” argmax(25 分钟)
- 寻找最大/最小值与定位索引的区别
np.max():告诉我最大值是多少。np.argmax():告诉我最大值所在的位置(下标/索引)。
- 机器学习真实场景应用
- 在图像分类模型(如手写数字识别 0~9)中,模型的输出通常是概率数组。例如:
[0.05, 0.10, 0.80, 0.02, 0.03]。 - 我们不在乎最高概率是 0.80,而是在乎 0.80 所在的索引位置是
2,这意味着模型预测该图片是“数字 2”。
- 在图像分类模型(如手写数字识别 0~9)中,模型的输出通常是概率数组。例如:
- 👨🏫 教师活动:演示
argmax的推导过程,说明分类决策逻辑,引导学生理解“为什么索引就是类别 ID”。 - 🧑🎓 学生活动:编写代码,尝试更改预测概率数组中的数值,观察
argmax索引变化及对应预测类别的改变。
将 argmax 与分类算法预测逻辑打通,让学生理解“求索引”在 AI 判定中的实际应用,避免枯燥的函数说明。
✍️ 四、 解决问题过程(三):课堂练习与巩固(20 分钟)
📝 五、 课堂小结(5 分钟)
flowchart LR
root["📊 2-2 NumPy 基础:数据的变形与定位"]
subgraph C1["📐 维度查看与规则"]
direction TB
A1["arr.shape:获取维度元组"]
A2["守恒定律:变形前后元素总数不变"]
end
subgraph C2["🔄 形态变换 (reshape)"]
direction TB
B1["reshape(行, 列):重组数据维度"]
B2["-1 参数:自动推导未知维度"]
B3["reshape(-1, 1):转二维列向量 (避坑)"]
B4["flatten():多维矩阵拉直为一维"]
end
subgraph C3["🎯 维度定位 (argmax)"]
direction TB
C1_node["np.max():获取最大数值"]
C2_node["np.argmax():获取最大值索引"]
C3_node["核心场景:分类模型预测结果识别"]
end
root --> C1
root --> C2
root --> C3
%% 自定义主题色彩美化
style root fill:#4b6cb7,stroke:#253b6e,color:#fff,stroke-width:2px,rx:8px,ry:8px
style C1 fill:#e3f2fd,stroke:#2196f3,stroke-width:1px
style C2 fill:#fff3e0,stroke:#ff9800,stroke-width:1px
style C3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1px