第 46 课 · 阶段八 · 项目实战

NumPy 数值计算

NumPy 是数值计算引擎,pandas、机器学习框架都建立在它之上。这一课掌握 ndarray 数组、向量化运算与高级索引。

第 46 课阶段八 · 项目实战难度:进阶建议时长:40 分钟关键词:ndarray · 运算 · 索引

🎯 学完本课你将掌握

  • 创建 ndarray 数组
  • 理解向量化运算(告别 for 循环)
  • 掌握索引、切片与广播
  • 会用常用数学与统计函数

一、安装

安装
1pip install numpy

二、创建数组

创建数组.py
1import numpy as np
2
3a = np.array([1, 2, 3, 4, 5]) # 一维数组
4b = np.array([[1, 2], [3, 4]]) # 二维数组
5print(a)
6print(b)
7print(a.shape) # (5,) 形状
8print(b.shape) # (2, 2)
9print(a.ndim) # 维度数
10print(a.dtype) # 元素类型 int64

三、特殊数组

特殊数组.py
1import numpy as np
2print(np.zeros(3)) # [0. 0. 0.]
3print(np.ones((2, 2))) # 2x2 全1
4print(np.arange(0, 10, 2)) # [0 2 4 6 8] 类似 range
5print(np.linspace(0, 1, 5)) # [0. 0.25 0.5 0.75 1.] 等分
6print(np.random.rand(3)) # 0-1 随机3个数

四、向量化运算:核心优势

对数组整体做运算,自动应用到每个元素,比 Python for 循环快几十上百倍。

向量化.py
1import numpy as np
2a = np.array([1, 2, 3, 4])
3print(a + 10) # [11 12 13 14]
4print(a * 2) # [ 2 4 6 8]
5print(a ** 2) # [ 1 4 9 16]
6print(np.sqrt(a)) # 开方
7print(a[a > 2]) # [3 4] 布尔索引筛选

五、索引与切片

索引切片.py
1import numpy as np
2a = np.arange(10)
3print(a[2]) # 2
4print(a[2:5]) # [2 3 4]
5print(a[::-1]) # 反转
6
7b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
8print(b[1, 2]) # 6 第1行第2列
9print(b[:, 1]) # [2 5 8] 所有行的第1列
10print(b[0, :]) # [1 2 3] 第一行

六、统计与数学函数

统计.py
1import numpy as np
2a = np.array([3, 1, 4, 1, 5, 9, 2, 6])
3print(a.sum()) # 31
4print(a.mean()) # 平均值
5print(a.max(), a.min()) # 9 1
6print(a.std()) # 标准差
7print(np.sort(a)) # 排序(返回新数组)

七、广播机制

不同形状的数组也能运算:小数组会自动“扩展”到大数组的形状。

广播.py
1import numpy as np
2a = np.array([[1, 2], [3, 4]])
3b = np.array([10, 20])
4print(a + b) # [[11 22] [13 24]] b自动扩展到每行

八、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
形状不一致无法广播检查 shape,用 reshape 调整;加 np.newaxis 增加维度。
用列表混合类型出错np.array([1, "a"]) 会变成字符串数组,保持同类型。
与 Python 列表混淆列表的 + 是拼接、数组的 + 是逐元素相加,注意区分。
✍️ 小练习
创建一个 4x4 随机数组:计算整体均值、每行均值、取出第 2 行第 3 列、把大于 0.5 的元素替换为 1。
📌 本节小结
NumPy 三件宝:ndarray 数组(shape/dtype)、向量化运算(快)、广播机制(灵活)。它是 pandas 与机器学习的地基,值得重点掌握。