NumPy 中多维数组的切片操作是处理高维数据(如矩阵、图像等)的核心技能,其语法在一维切片基础上扩展,通过逗号分隔不同维度的切片规则,实现对多维度数据的精准提取。
一、基本语法
多维数组的切片格式为:
arr[dim1_slice, dim2_slice, ..., dimN_slice]
其中,每个 dim_slice 表示对应维度的切片规则,支持与一维数组相同的切片语法:start:stop:step(起始索引:结束索引:步长),且各维度切片独立生效。
- 默认值:
start默认为0,stop默认为维度长度,step默认为1。 - 负数索引:表示从末尾开始(如
-1为最后一个元素)。
二、核心切片方式及示例
假设存在一个 3 维数组 arr( shape 为 (4, 5, 6),可理解为 4 个 5 行 6 列的矩阵):
import numpy as np
arr = np.arange(4*5*6).reshape(4, 5, 6) # shape: (4, 5, 6)
1. 各维度独立切片(最常用)
对每个维度分别指定 start:stop:step,提取对应范围的子数组。
-
示例 1(二维数组简化):
对shape=(5,6)的二维数组mat = arr[0](取 3 维数组的第 0 个矩阵):mat[1:4, 2:5] # 第1-3行(索引1到3,不含4),第2-4列(索引2到4,不含5) # 结果 shape: (3, 3) -
示例 2(三维数组):
arr[1:3, :3, ::2] # 第1-2个矩阵(0维:1到2),前3行(1维:0到2),列隔1取1(2维:步长2) # 结果 shape: (2, 3, 3)
2. 省略维度(: 与 ...)
-
:表示取全维度:某维度用:时,提取该维度的所有元素。
示例:arr[:, 2, :]表示取 0 维全量、1 维索引 2、2 维全量,结果 shape 为(4, 6)。 -
...(省略号)表示“剩余所有维度”:简化高维数组的切片写法,尤其适合维度数不确定的场景。
示例:arr[..., 3] # 等价于 arr[:, :, 3],取最后一个维度的索引3,结果 shape: (4, 5) arr[1, ...] # 等价于 arr[1, :, :],取第0维索引1的所有元素,结果 shape: (5, 6)
3. 整数索引与切片结合
若某维度用整数索引(而非切片),则该维度会被“压缩”(降维)。
示例:
arr[2, 1:4, :] # 0维用整数索引2(取第3个矩阵),1维切片1:4,2维全取
# 结果 shape: (3, 6)(原3维→2维,因0维被压缩)
4. 步长与逆序
- 步长
step:控制切片的间隔,step>0正向取,step<0反向取(逆序)。
示例:
arr[::2, :, ::-1] # 0维:隔1取1(取0,2矩阵);2维:逆序(列从后往前取)
# 结果 shape: (2, 5, 6)
5. 布尔切片(条件筛选)
通过布尔数组(与原数组维度匹配)筛选元素,返回满足条件的所有元素(一维数组)。
示例:
mask = arr > 100 # 生成与arr同shape的布尔数组(True/False)
arr[mask] # 提取所有值>100的元素,结果为1维数组
三、注意事项
-
切片返回的是“视图”而非副本:修改切片结果会同步影响原数组(与 Python 列表不同)。
示例:sub = arr[1:3, 2:4] sub[0,0] = 999 # 原数组 arr[1,2] 会被改为 999若需副本,需显式复制:
sub = arr[1:3, 2:4].copy()。 -
索引越界:切片的
stop超过维度长度时,自动截断(不报错);但整数索引越界会报错。 -
维度顺序:NumPy 数组的维度顺序(如
(height, width, channel))需结合具体场景理解,避免切片时混淆维度。
多维数组切片的核心是“按维度独立处理”,通过 start:stop:step、整数索引、... 等组合,可灵活提取任意子数组。掌握切片规则能极大提升处理高维数据(如图像、张量)的效率。
850

被折叠的 条评论
为什么被折叠?



