NumPy 基本命令 (NumPy Basics)

1. 定义

NumPy 是 Python 的数值计算基础库,提供高维数组对象 ndarray 和一批向量化运算函数。 可以把它想成”Python 版的 Excel + 计算器”——用 C 实现底层循环,比原生 Python 列表快一到两个数量级。

原生 Python list 是”指针数组”,每个元素都是包装过的对象;NumPy ndarray 是”连续内存的同类型数据”,CPU 缓存命中率高,还能直接调 SIMD 指令。

2. 核心概念

概念含义类比
ndarrayn 维数组,所有元素同类型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 listNumPy 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 基础上的科学计算扩展(优化、插值、统计)