NumPy数组切片
文章目录
- NumPy数组切片
- 一、基础切片语法
- 二、一维数组切片
- 三、多维数组切片
- 四、高级切片技巧
- 1. 省略号(...)自动补全维度
- 2. 布尔掩码切片
- 3. 整数数组索引(Fancy Indexing)
- 五、视图 vs 副本
- 六、注意事项
- 七、总结
NumPy数组切片
NumPy
的 切片(Slicing) 操作允许高效地访问和操作数组的子集,其语法与 Python
列表类似但更强大,支持 多维切片 和 视图机制(非副本)。以下是核心用法详解:
一、基础切片语法
切片语法为 start:stop:step
,对每个维度独立生效。
规则:
- start:起始索引(包含)
- stop:结束索引(不包含)
- step:步长(默认1)
二、一维数组切片
import numpy as nparr = np.array([0, 1, 2, 3, 4, 5])# 获取索引2到4(不包含4)的元素
print(arr[2:4]) # 输出: [2 3]# 前三个元素
print(arr[:3]) # 输出: [0 1 2]# 每隔一个元素取一次
print(arr[::2]) # 输出: [0 2 4]# 反转数组
print(arr[::-1]) # 输出: [5 4 3 2 1 0]
三、多维数组切片
每个维度用逗号分隔,支持独立切片规则。
二维数组示例
matrix = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 获取前两行的第2、3列
print(matrix[:2, 1:3])
# 输出:
# [[2 3]
# [5 6]]# 所有行的第1列
print(matrix[:, 0]) # 输出: [1 4 7]# 每隔一行、逆序列
print(matrix[::2, ::-1])
# 输出:
# [[3 2 1]
# [9 8 7]]
三维数组示例
cube = np.array([[[1, 2], [3, 4]],[[5, 6], [7, 8]]])# 第二个二维块的第一行、所有列
print(cube[1, 0, :]) # 输出: [5 6]
四、高级切片技巧
1. 省略号(…)自动补全维度
rnd = np.random.default_rng(1800)
arr_4d = rnd.integers(10, size=(2, 3, 4, 5))
arr_4d
# 获取第一个3D块的前两行、所有列
arr_4d[0, :2, :, :]
2. 布尔掩码切片
data = np.array([5, 12, 8, 3])
mask = data > 6
print(data[mask]) # 输出: [12 8]
3. 整数数组索引(Fancy Indexing)
print(matrix[[0, 2], [1, 0]]) # 输出: [2 7] → 取(0,1)和(2,0)位置元素
五、视图 vs 副本
- 视图(View):切片操作默认返回原数组数据的引用,修改切片会影响原数组
sub_matrix = matrix[:2, :2]
sub_matrix[0,0] = 100
print(matrix[0,0]) # 输出: 100 → 原数组被修改
- 副本(Copy):显式调用 .copy() 创建独立副本
sub_copy = matrix[:2, :2].copy()
sub_copy[0,0] = 200
print(matrix[0,0]) # 仍为100 → 原数组不变
六、注意事项
-
- 内存布局: 切片视图的内存与原数组连续,可能影响计算效率
-
- 负步长: 当
step < 0
时,start
应大于stop
- 负步长: 当
-
- 维度保留: 使用
np.newaxis
可增加维度(如将向量转为矩阵)
- 维度保留: 使用
七、总结
场景 | 推荐操作 |
---|---|
提取局部数据 | 基础切片 start:stop:step |
批量修改子集 | 切片 + 赋值操作 |
需要独立数据副本时 | 显式调用 .copy() |
跨步长采样 | 设置 step 参数(如 ::2 ) |