NumPy 基本命令 (NumPy Basics)
1. 定义
NumPy 是 Python 的数值计算基础库,提供高维数组对象 ndarray 和一批向量化运算函数。
可以把它想成”Python 版的 Excel + 计算器”——用 C 实现底层循环,比原生 Python 列表快一到两个数量级。
原生 Python list 是”指针数组”,每个元素都是包装过的对象;NumPy ndarray 是”连续内存的同类型数据”,CPU 缓存命中率高,还能直接调 SIMD 指令。
2. 核心概念
| 概念 | 含义 | 类比 |
|---|---|---|
ndarray | n 维数组,所有元素同类型 | Excel 的一张数据表 |
dtype | 元素数据类型(如 int64、float32) | 表格列的数据类型 |
shape | 各维度大小的元组,如 (2, 3) | 表格的行数 × 列数 |
axis | 轴编号,沿哪个方向操作 | 行方向 / 列方向 |
broadcasting | 不同 shape 的数组按规则自动扩展对齐 | Excel 公式自动填充 |
vectorization | 用数组运算替代 for 循环 | 一次算一整列,不逐格算 |
3. 创建数组的常用方式
import numpy as np
a = np.array([1, 2, 3]) # 从 list 创建一维数组
b = np.array([[1, 2], [3, 4]]) # 从嵌套 list 创建二维数组
z = np.zeros((2, 3)) # 全 0 数组,shape (2,3)
o = np.ones((3,)) # 全 1 数组
e = np.eye(3) # 3x3 单位矩阵
r = np.arange(0, 10, 2) # 类似 range,array([0,2,4,6,8])
l = np.linspace(0, 1, 5) # 0 到 1 之间均匀取 5 个点
rand = np.random.rand(2, 2) # [0,1) 均匀分布随机数
randn = np.random.randn(2, 2) # 标准正态分布随机数4. 基本命令速查
a = np.array([[1, 2, 3], [4, 5, 6]])
# ── 查看属性 ──
a.shape # (2, 3)
a.ndim # 2 维度数
a.dtype # int64
a.size # 6 元素总数
# ── 索引与切片 ──
a[0] # 第一行 → array([1, 2, 3])
a[0, 1] # 第 0 行第 1 列 → 2
a[:, 1] # 所有行的第 1 列 → array([2, 5])
a[1, :] # 第 1 行全部
a[a > 3] # 布尔索引 → array([4, 5, 6])
# ── 形状变换 ──
a.reshape(3, 2) # 改 shape,元素总数须一致
a.T # 转置
a.flatten() # 拍平成一维
# ── 聚合运算(可指定 axis)──
a.sum() # 所有元素求和 → 21
a.sum(axis=0) # 沿行方向求和(每列求和)→ array([5, 7, 9])
a.sum(axis=1) # 沿列方向求和(每行求和)→ array([6, 15])
a.mean() # 均值
a.max(), a.min() # 最大、最小
a.argmax() # 最大值的索引
# ── 向量化运算(逐元素)──
a * 2 # 每个元素 × 2
a + 10 # 每个元素 + 10
a * a # 逐元素平方(不是矩阵乘法)
a @ a.T # 矩阵乘法,等价于 a.dot(a.T)
# ── 拼接与拆分 ──
np.vstack([a, a]) # 垂直拼接(行变多)
np.hstack([a, a]) # 水平拼接(列变多)
np.split(a, 2) # 沿 axis=0 等分成 2 份记忆
axis的诀窍:axis=0是”沿着行的方向往下走”,所以sum(axis=0)是把每列加起来;axis=1是”沿着列的方向往右走”,所以sum(axis=1)是把每行加起来。
5. 对比辨析表
| 对比项 | Python list | NumPy ndarray |
|---|---|---|
| 元素类型 | 可混合 | 必须同类型 |
| 运算方式 | 逐元素循环 | 向量化、底层 C |
+ 含义 | 列表拼接 | 逐元素相加 |
* 含义 | 重复列表 | 逐元素相乘 |
| 内存占用 | 大(每个元素是对象) | 紧凑连续 |
| 适用场景 | 通用容器、异构数据 | 数值计算、矩阵运算 |
6. 典型工作流
# 数据标准化 (z-score):减均值、除标准差
data = np.array([10, 20, 30, 40, 50])
normalized = (data - data.mean()) / data.std()
# 矩阵点积 + 广播
W = np.random.rand(3, 4) # 权重
x = np.random.rand(4) # 输入
y = W @ x + 0.5 # 仿射变换,0.5 自动广播7. 常见误区
- ❌ “
a * b就是矩阵乘法” → 错,*是逐元素相乘;矩阵乘法用@或np.dot - ❌ “NumPy 数组可以装任意类型” → 错,一个数组
dtype必须统一,混入字符串会把数字也转成字符串 - ❌ “reshape 会复制数据” → 错,
reshape返回视图(view),改了会影响原数组;要副本用.copy() - ❌ “axis=0 就是行” → 错,axis=0 是”沿行方向操作”,结果是每列聚合,初学者最容易记反
8. 延伸阅读 / 关联概念
- pandas — 基于 NumPy 之上的表格数据分析库,带标签的列/行
- Broadcasting 规则 — 官方文档 Broadcasting章节,理解后能写出更简洁的向量化代码
- matplotlib — 配合 NumPy 数组做可视化
- SciPy — 在 NumPy 基础上的科学计算扩展(优化、插值、统计)