Python编程基础(三):NumPy——AI工程师的第一件武器
假设你是一个小学老师……
班上有50个学生,期末考试结束了,你手里有50张成绩单。
现在校长让你做几件事:算全班的平均分、找出最高分和最低分、看看有多少人及格、按成绩排个名次。
如果你一张一张地看,那得看50遍。而且下次月考你还得再这么干一遍。
你肯定不会这么傻。你会拿一张表,把50个分数写成一列,然后一眼扫过去就能找到最高分,拿个计算器一按就能算平均分。
你已经在不知不觉中使用了**”批量处理”**的思维方式——不是一次处理一个数据,而是一次处理一整批数据。
NumPy做的工作,就是这个。
为什么AI需要NumPy?
先看一个问题:如果你的大脑处理一个数字要1秒钟,那处理一百万个数字要多久?
如果一次只处理一个——一百万秒,大约11.5天。
但如果你的大脑升级了,可以同时处理一百万个数字——只要一秒。
从11.5天到1秒,这就是NumPy带来的效率提升。
在Python原生世界里,你要处理一百万个数字,就得用一个包含一百万个元素的列表,然后一个一个地算。Python的列表是”慢的”,因为它设计上就不是一个做数学计算的工具。
而NumPy的数组(array)是”快的”,因为它底层用C语言实现,对内存和计算做了大量优化。
让我们来感受一下差距:
1 | import time |
在你的电脑上跑一下,你会看到NumPy的速度大约是Python列表的 50到100倍。
一百万个数字尚且如此,当你处理上亿的AI训练数据时,没有NumPy是不可想象的。
安装NumPy
如果你之前装了Anaconda,NumPy很可能已经装好了。验证一下:
1 | import numpy as np |
如果输出了版本号(比如 1.26.4),说明已经有了。
如果没有,安装很简单:
1 | pip install numpy |
一行命令,搞定。
ndarray:数组就像超级表格
NumPy的核心数据结构叫 ndarray(N-dimensional array,N维数组)。
你可以把它理解为一个”超级表格”:
- 一维数组 = 一排数字,像一个横向的表格
- 二维数组 = 一个有行有列的表格(就像Excel)
- 三维数组 = 多个表格叠在一起(像一个Excel工作簿有多个sheet)
下面来创建几个:
1 | import numpy as np |
查看数组的形状(shape):
1 | print(scores.shape) # (7,) —— 7个元素 |
创建数组的N种方式
除了直接 np.array() 手动输入,NumPy还提供了很多快捷方式:
从零开始创建
1 | # 全0数组——初始化一个空表格 |
随机数组——AI训练经常用
1 | # 0到1之间的随机数 |
np.random 在AI里非常重要。神经网络的权重初始化、数据增强、随机采样……到处都离不开随机数。
等间隔数组
1 | # 从0到1,均匀分成5个点 |
数组运算:买菜算账的智慧
NumPy的运算分两种,搞清楚它们的区别很重要:
逐元素运算——每个位置各自算
1 | prices = np.array([3.5, 5.0, 2.8, 4.2]) # 每种蔬菜的单价 |
这就像你去菜市场,西红柿3.5一斤买了2斤、白菜5.0一斤买了1斤……你不需要一个一个算,NumPy帮你一次性全算完。
关键特性:两个数组形状相同,运算会自动对应每个位置的元素。
标量和数组的运算也一样:
1 | prices = np.array([10, 20, 30, 40]) |
矩阵运算——真正的线性代数
1 | # 矩阵乘法(不是逐元素相乘!) |
* 是逐元素相乘,@ 是矩阵乘法。这两个运算完全不同,千万别搞混。
矩阵乘法是AI的核心运算之一。神经网络的”前向传播”,本质上就是一堆矩阵乘法的嵌套。
索引和切片:像切蛋糕一样取数据
NumPy的索引语法和Python列表很像,但更强大:
1 | data = np.array([10, 20, 30, 40, 50, 60, 70, 80]) |
二维数组的索引:
1 | grades = np.array([ |
口诀:逗号前面管行,逗号后面管列。冒号 : 表示”全部”。
常用函数:一个函数解决一整列数据
1 | scores = np.array([85, 92, 78, 95, 88, 76, 90, 82, 73, 96]) |
注意最后一行——布尔值可以直接参与数学运算,True就是1,False就是0。这个特性非常实用。
reshape 是另一个常用函数:
1 | data = np.arange(12) # [0 1 2 3 4 5 6 7 8 9 10 11] |
实战场景:用NumPy分析学生成绩
让我们把前面学的知识串起来,做一个完整的成绩分析:
1 | import numpy as np |
运行这段代码,你会得到类似这样的输出:
1 | 各科目平均分: |
你看,50个学生、5门课、250个数据点——用NumPy,几行代码就完成了统计、排序、分析。
如果用Python列表和循环来做同样的功能,代码量至少翻三倍,速度还会慢几十倍。
关键概念小结
| 概念 | 作用 | 类比 |
|---|---|---|
ndarray |
存储数据的核心结构 | 超级表格 |
逐元素运算 |
对应位置各自计算 | 买每种菜各自算价钱 |
矩阵乘法 @ |
线性代数运算 | AI神经网络的基础 |
索引/切片 |
取出特定位置的值 | 切蛋糕 |
axis |
指定运算方向 | axis=0竖着算,axis=1横着算 |
布尔索引 |
用条件筛选数据 | “把及格的人挑出来” |
axis 可能是最容易搞混的概念。记住:axis=0 是跨行(竖着),axis=1 是跨列(横着)。 或者更直白地记:axis=0 压缩行(让行消失),axis=1 压缩列(让列消失)。
下一站:Pandas
NumPy解决了”高效计算”的问题,但它有一个短板——不能处理非数值数据(比如名字、日期、类别标签)。
当你的数据里既有数字又有文字,而且需要做分组、筛选、合并这些操作时,你需要一个更强大的工具:Pandas。
NumPy是你的第一件武器,Pandas是第二件。两件配合使用,数据处理就游刃有余了。
不过在那之前,先确保你对NumPy的手感足够好——试着修改上面”成绩分析”的代码,看看能不能加一些自己的分析逻辑。
真正的学习能力,从来不是看完一篇文章就掌握,而是动手改一改、试一试、犯一犯错误,然后才真正属于你。
