几乎所有高级功能都依赖切片操作,它是高效处理大规模数值数据的基础技能,掌握切片,才能真正驾驭数组。
本文列出一维、二维、三维数组切片,作为记录和备查。
文中表格示例使用AI生成。
1、记住要点
- 切片返回原数组的视图(共享内存)
- 修改切片会影响原数组
- 需要副本使用copy()
2、一维数组切片
语法
python
# 一维数组
arr[start:stop:step]
-
start:起始索引(包含),默认为0
-
stop:结束索引(不包含),默认为数组长度
-
step:步长,默认为1(可为负数,表示逆序)
创建一个一维数组
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
| 操作目的 | 切片语法 | 示例代码 | 输出结果 |
|---|---|---|---|
取前 n 个元素 |
arr[:n] |
arr[:5] |
[0 1 2 3 4] |
取后 n 个元素 |
arr[-n:] |
arr[-3:] |
[5 6 7 8 9] |
| 取中间某段 | arr[start:end] |
arr[2:8] |
[2 3 4 5 6 7] |
| 跳着取元素(步长) | arr[::step] |
arr[::2] |
[0 2 4 6 8] |
| 反转整个数组 | arr[::-1] |
arr[::-1] |
[9 8 7 6 5 4 3 2 1 0] |
| 倒序取一段 | arr[start:end:-1] |
arr[5:2:-1] |
[5 4 3] |
| 去掉最后一个元素 | arr[:-1] |
arr[:-1] |
[0 1 2 3 4 5 6 7 8] |
| 去掉头尾 | arr[1:-1] |
arr[1:-1] |
[1 2 3 4 5 6 7 8] |
| 取偶数索引元素 | arr[::2] |
arr[::2] |
[0 2 4 6 8] |
| 取奇数索引元素 | arr[1::2] |
arr[1::2] |
[1 3 5 7 9] |
| 条件筛选(大于某值) | arr[arr > x] |
arr[arr > 5] |
[6 7 8 9] |
| 按指定下标提取 | arr[indices] |
arr[[1,5,7]] |
[1,5,7] |
3、二维数组切片
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
arr[行切片, 列切片]
| 操作目的 | 切片语法 | 示例代码 | 输出结果 |
|---|---|---|---|
| 获取某一行 | arr[row, :] 或 arr[row] |
arr[1] |
[5 6 7 8] |
| 获取某一列 | arr[:, col] |
arr[:, 2] |
[3 7 11] |
| 获取连续多行 | arr[r1:r2, :] |
arr[0:2, :] |
[[1 2 3 4], [5 6 7 8]] |
| 获取连续多列 | arr[:, c1:c2] |
arr[:, 1:3] |
[[2 3], [6 7], [10 11]] |
| 提取子矩阵 | arr[r1:r2, c1:c2] |
arr[1:, 2:] |
[[7 8], [11 12]] |
| 跳着取行和列 | arr[::step_r, ::step_c] |
arr[::2, ::2] |
[[1 3], [9 11]] |
| 反转所有行 | arr[::-1, :] |
arr[::-1] |
[[9 10 11 12], [5 6 7 8], [1 2 3 4]] |
| 反转所有列 | arr[:, ::-1] |
arr[:, ::-1] |
[[ 4 3 2 1] [ 8 7 6 5] [12 11 10 9]] |
| 反转行列 | arr[::-1, ::-1] |
arr[::-1, ::-1] |
[[12 11 10 9] [ 8 7 6 5] [ 4 3 2 1]] |
| 获取前 N 行 | arr[:n, :] |
arr[:2, :] |
[[1 2 3 4] [5 6 7 8]] |
| 获取后 N 行 | arr[-n:, :] |
arr[-2:, :] |
[[ 5 6 7 8] [ 9 10 11 12]] |
| 获取前 N 列 | arr[:, :n] |
arr[:, :3] |
[[ 1 2 3] [ 5 6 7] [ 9 10 11]] |
| 获取后 N 列 | arr[:, -n:] |
arr[:, -2:] |
[[ 3 4] [ 7 8] [11 12]] |
| 条件切片(布尔索引) | arr[arr > x] |
arr[arr > 5] |
[6 7 8 9 10 11 12] |
| 按行条件筛选 | 需结合 np.any() / np.all() |
arr[np.any(arr > 10, axis=1)] |
[[ 9 10 11 12]] |
| 花式索引取特定行 | arr[[i, j, k], :] |
arr[[0, 2], :] |
[[ 1 2 3 4] [ 9 10 11 12]] |
| 花式索引取特定列 | arr[:, [i, j]] |
arr[:, [1, 3]] |
[[ 2 4] [ 6 8] [10 12]] |
| 同时取指定行列 | arr[[r1,r2], [c1,c2]] |
arr[[0,1], [1,2]] |
[2 7] |
4、三维数组切片
三维数组可以看作由多个二维数组(矩阵)组成的数组。一个形状为 (d, h, w) 的三维数组:
-
d:深度(层数)
-
h:高度(行数)
-
w:宽度(列数)
arr = np.array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
层0(第一层)
┌──────
│ 0 1 2 3
│ 4 5 6 7
│ 8 9 10 11
└───────
层1(第二层)
┌────────
│ 12 13 14 15
│ 16 17 18 19
│ 20 21 22 23
└────────
| 操作目的 | 切片语法 | 示例代码 | 输出结果 |
|---|---|---|---|
| 获取整个数组 | [:, :, :] 或 ... |
arr[:, :, :] |
整个数组 |
| 获取第一层(第一个二维数组) | [0, :, :] 或 [0, ...] |
arr[0, :, :] |
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] |
| 获取第二层(第二个二维数组) | [1, :, :] 或 [1, ...] |
arr[1, ...] |
[[12 13 14 15] [16 17 18 19] [20 21 22 23]] |
| 获取所有层的第一行 | [:, 0, :] |
arr[:, 0, :] |
[[ 0 1 2 3] [12 13 14 15]] |
| 获取所有层的第二列 | [:, :, 1] |
arr[:, :, 1] |
[[ 1 5 9] [13 17 21]] |
| 反转所有层的行 | [:, ::-1, :] |
arr[:, ::-1, :] |
[[[ 8 9 10 11] [ 4 5 6 7] [ 0 1 2 3]] [[20 21 22 23] [16 17 18 19] [12 13 14 15]]] |