Numpy学习3-数组切片

几乎所有高级功能都依赖切片操作,它是高效处理大规模数值数据的基础技能,掌握切片,才能真正驾驭数组。

本文列出一维、二维、三维数组切片,作为记录和备查。

文中表格示例使用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]]]
相关推荐
七夜zippoe19 小时前
NumPy向量化计算实战:从入门到精通的性能优化指南
python·性能优化·架构·numpy·广播机制·ufunc
one day3213 天前
从numpy-pillow-opencv的基础学习
opencv·numpy·pillow
lrh1228005 天前
Numpy学习
numpy
拾贰_C5 天前
[python | numpy] numpy& matplotib冲突
开发语言·python·numpy
陈晨辰熟稳重7 天前
20260113-np.random.multinomial 与 torch.multinomial
pytorch·python·numpy·采样·multinomial
charlie1145141917 天前
从 0 开始的机器学习——NumPy 线性代数部分
开发语言·人工智能·学习·线性代数·算法·机器学习·numpy
muddjsv11 天前
NumPy 常用工具:统计、排序、缺失值处理
numpy
muddjsv12 天前
NumPy 核心运算:向量化与广播
numpy
muddjsv12 天前
NumPy 实战:从基础到场景化应用
numpy
A尘埃12 天前
Numpy常用方法介绍
numpy