多维数组切片用逗号分隔各维度规则,独立应用一维语法,不复制内存、效率高;二维中逗号前控行、后控列;三维支持省略号与降维;负步长需匹配索引方向;连续切片返回视图,高级索引触发副本。

多维数组切片的核心是用逗号分隔各维度的规则,每个维度独立应用一维切片语法 start:stop:step,不改变底层数据、不复制内存,效率高。
二维数组切片:行与列分别控制
二维数组最常用,比如表格或灰度图。语法形如 arr[行切片, 列切片],逗号前管行,逗号后管列。
-
arr[:3, :2]→ 取前3行、前2列(行索引0–2,列索引0–1) -
arr[1:, ::2]→ 从第2行开始到底,列方向每隔1个取1个(即取第0、2、4…列) -
arr[:, 2]→ 所有行的第3列,结果是一维数组;而arr[:, 2:3]保留二维结构,结果 shape 为 (n, 1)
三维数组切片:对应“批次×高度×宽度”或“RGB通道”
例如图像数组 shape 为 (100, 256, 256, 3),取第0张图的红色通道:img[0, :, :, 0];若想批量取所有图的绿色通道:img[:, :, :, 1]。
-
arr[::2, 10:20, :]→ 第0维隔1取1,第1维取索引10–19,第2维全取 -
arr[1, ..., 2]等价于arr[1, :, :, 2],省略号自动补全中间所有维度 - 用整数选某维会降维:如
arr[3, :, :]结果是二维;arr[3, 5, :]结果是一维
步长与负索引:灵活定位和逆序
步长可正可负,负步长配合负索引常用于反转或倒序采样。
-
arr[::-1, :]→ 行方向完全反转,列不变 -
arr[:, -3:]→ 所有行,最后3列(索引 -3, -2, -1) -
arr[2:8:-2]无效(start > stop 且 step > 0),应写成arr[7:1:-2]或更直观的arr[2:8][::-2]
切片 vs 高级索引:避免意外拷贝
连续切片(如 [:, 1:5:2])返回视图,修改会影响原数组;但用布尔数组或整数列表(如 arr[[0,2,4], :])会触发副本,内存翻倍且不可写。
- 检查是否为视图:
arr_slice.base is not None且arr_slice.flags.owndata == False - 需安全赋值时,显式用
.copy();只读场景下可设arr.setflags(write=False) - 条件筛选优先用
np.compress(condition, arr, axis=0)替代布尔索引,语义清晰且部分版本性能更好











