slice()函数在 NumPy 中的计算逻辑,核心就是“按步长在数组上跳格子”。
它的计算规则完全由三个参数决定:start(起点)、stop(终点)、step(步长)。你可以把它想象成在一条数字线上玩跳棋。
核心计算规则
slice(start, stop, step)会生成一个索引序列,规则如下:
- 起点:从
start这个索引位置开始。 - 步长:每次增加
step。 - 终点:当索引值达到或越过
stop时停止(不包含stop本身)。
一维数组的“跳格子”演示
假设有一个数组a = np.array(),我们来看几个例子:
例1:slice(2, 7, 2)或a[2:7:2]
- 计算过程:
- 起点:索引
2→ 元素2 - 步长 +2:索引
4→ 元素4 - 步长 +2:索引
6→ 元素6 - 步长 +2:索引
8→注意:8已经 >=stop(7) 了,所以停止。
- 起点:索引
- 结果:``
例2:slice(5)或a[:5]
- 计算过程:
start默认为0,step默认为1。- 起点:索引
0→ 元素0 - 步长 +1:索引
1→ 元素1 - …直到索引
4→ 元素4 - 步长 +1:索引
5→注意:5已经 >=stop(5) 了,所以停止。
- 起点:索引
- 结果:``
例3:slice(2, 9, 3)或a[2:9:3]
- 计算过程:
- 起点:索引
2→ 元素2 - 步长 +3:索引
5→ 元素5 - 步长 +3:索引
8→ 元素8 - 步长 +3:索引
11→注意:11已经 >=stop(9) 了,所以停止。
- 起点:索引
- 结果:``
多维数组的“坐标切片”
对于二维数组,计算逻辑是一样的,只是变成了同时控制行和列两个维度。
假设有一个二维数组a:
a=np.array([,,])例4:a[1:, :2]
- 计算过程:
- 行维度
1::从第1行开始,取到最后 → 行索引 `` - 列维度
:2:从第0列开始,取到第2列(不包含)→ 列索引 ``
- 行维度
- 结果:取行索引
和列索引交汇处的元素。- 行
1,列0→4 - 行
1,列1→5 - 行
2,列0→7 - 行
2,列1→8
- 行
- 最终输出:
[,]
特殊情况:负步长(反向切片)
当step为负数时,计算方向会反转,从右向左“跳格子”。
例5:a[::-1]
- 计算过程:
start默认为-1(最后一个元素),stop默认为-len(a)-1(第一个元素之前),step为-1。- 起点:索引
-1→ 元素9 - 步长 -1:索引
-2→ 元素8 - …直到索引
0→ 元素0
- 起点:索引
- 结果:``(数组被反转了)
总结
slice()的计算逻辑可以用一句话概括:
从start出发,以step为步长,向stop方向“跳格子”,跳到stop面前就停,stop本身不取。
step > 0:从左向右跳。step < 0:从右向左跳。start或stop省略:默认走到数组的“头”或“尾”。