Python NumPy二维与三维数组切片详解

陆遥
陆遥
发布时间:2026-10-13| 4人浏览过
原创

本文详细解析Python中NumPy库对二维及三维数组的切片操作。通过具体代码示例,阐明冒号在多维索引中的维度对应关系,涵盖单元素提取、范围截取及负索引用法,帮助开发者掌握高效的数据处理技巧。

二维数组切片基础

当处理二维数组时,切片语法表现为 x[:] 的形式,其中包含一个冒号。该冒号将索引分为两部分,分别对应数组的第0维度和第1维度。

对于三维数组,切片语法为 x[::],包含两个冒号,从而划分出三个间隔。这三个间隔依次对应数组的第0、第1和第2个维度。

常见的二维数组切片形式包括 x[n,:]、x[:,n]、x[m:n,:] 以及 x[:,m:n]。

在上述语法中,(m:n) 应视为一个整体单元。除 (m:n) 外的其他冒号用于指定操作所在的维度。

在二维数组中,冒号前的 (n,) 表示对第0维度上的第 n 号元素进行操作;冒号后的 (,n) 表示对第1维度上的第 n 号元素进行操作。若将 n 替换为 (m:n),则表示对第 m 号至第 n-1 号元素进行操作。

具体示例如下:


import numpy as np

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]])
print(a.shape)
print(a[0, :], a[0, :].shape)
print(a[1, :], a[1, :].shape)
print(a[-1, :], a[-1, :].shape)
print(a[0:2, :], a[0:2, :].shape)
print(a[:, 0], a[:, 0].shape)
print(a[:, 1], a[:, 1].shape)
print(a[:, -1], a[:, -1].shape)
print(a[:, 0:2], a[:, 0:2].shape)

运行结果如下:


(5, 4)
[1 2 3 4] (4,)
[5 6 7 8] (4,)
[17 18 19 20] (4,)
[[1 2 3 4]
 [5 6 7 8]] (2, 4)
[ 1 5 9 13 17] (5,)
[ 2 6 10 14 18] (5,)
[ 4 8 12 16 20] (5,)
[[ 1 2]
 [ 5 6]
 [ 9 10]
 [13 14]
 [17 18]] (5, 2)

Process finished with exit code 0

以上示例中,数组 a 的形状为 shape=(5,4)。其第0维度包含5个元素,第1维度包含4个元素(元素可以是单个值,也可以是数组,此处“元素”是相对于特定维度而言的)。

  • a[0, :]、a[1, :] 和 a[-1, :] 分别提取了数组 a 在第0维度上的第0、第1和第-1个元素,每个提取结果均为包含4个元素的数组。
  • a[0:2, :] 提取了数组 a 在第0维度上的第0和第1两个元素,这两个元素均为包含4个元素的数组,共同组成一个新的二维数组。
  • a[:, 0]、a[:, 1] 和 a[:, -1] 分别提取了数组 a 在第1维度上的第0、第1和第-1个元素,每个提取结果均为单个元素值。
  • a[:, 0:2] 提取了数组 a 在第1维度上的第0和第1两个元素,这两个元素均为单个元素值,共同组成一个新的二维数组。

三维数组切片基础

三维数组的常见切片形式包括 x[n,::]、x[:,n:]、x[::,n]、x[:,:,n]、x[m:n,::]、x[:,m:n:]、x[::,m:n] 以及 x[:,:,m:n]。

在上述语法中,(m:n) 应视为一个整体单元。除 (m:n) 外的两个冒号用于指定操作所在的维度。

在三维数组中,最前面的双冒号前的 (n,) 表示对第0维度上的第 n 号元素进行操作;中间双冒号后的 (,n) 表示对第1维度上的第 n 号元素进行操作;最后双冒号后的 (,n) 表示对第2维度上的第 n 号元素进行操作。若将 n 替换为 (m:n),则表示对第 m 号至第 n-1 号元素进行操作。

具体示例如下:


import numpy as np

b = np.array([[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
       [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]],
       [[25, 26, 27, 28], [29, 30, 31, 32], [33, 34, 35, 36]],
       ])

print(b.shape)
print("b[0, ::],b[1, ::],b[-1, ::],b[0:2, ::]")
print(b[0, ::], b[0, ::].shape)
print(b[1, ::], b[1, ::].shape)
print(b[-1, ::], b[-1, ::].shape)
print(b[0:2, ::], b[0:2, ::].shape)
print("b[:, 0:],b[:, 1:],b[:, -1:],b[:, 0:2:]")
print(b[:, 0:], b[:, 0:].shape)
print(b[:, 1:], b[:, 1:].shape)
print(b[:, -1:], b[:, -1:].shape)
print(b[:, 0:2:], b[:, 0:2:].shape)
print("b[::, 0],b[::, 1],b[::, -1],b[::, 0:2:]")
print(b[::, 0], b[::, 0].shape)
print(b[::, 1], b[::, 1].shape)
print(b[::, -1], b[::, -1].shape)
print(b[::, 0:2:], b[::, 0:2].shape)
print("b[:,:, 0],b[:,:, 1],b[:,:, -1],b[:,:, 0:2:]")
print(b[:, :, 0], b[:, :, 0].shape)
print(b[:, :, 1], b[:, :, 1].shape)
print(b[:, :, -1], b[:, :, -1].shape)
print(b[:, :, 0:2:], b[:, :, 0:2].shape)

运行结果如下:


(3, 3, 4)
b[0, ::],b[1, ::],b[-1, ::],b[0:2, ::]
[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]] (3, 4)
[[13 14 15 16]
 [17 18 19 20]
 [21 22 23 24]] (3, 4)
[[25 26 27 28]
 [29 30 31 32]
 [33 34 35 36]] (3, 4)
[[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]]

 [[13 14 15 16]
 [17 18 19 20]
 [21 22 23 24]]] (2, 3, 4)
b[:, 0:],b[:, 1:],b[:, -1:],b[:, 0:2:]
[[[ 1 2 3 4]
 [ 5 6 7 8]
 [ 9 10 11 12]]

 [[13 14 15 16]
 [17 18 19 20]
 [21 22 23 24]]

 [[25 26 27 28]
 [29 30 31 32]
 [33 34 35 36]]] (3, 3, 4)
[[[ 5 6 7 8]
 [ 9 10 11 12]]

 [[17 18 19 20]
 [21 22 23 24]]

 [[29 30 31 32]
 [33 34 35 36]]] (3, 2, 4)
[[[ 9 10 11 12]]

 [[21 22 23 24]]

 [[33 34 35 36]]] (3, 1, 4)
[[[ 1 2 3 4]
 [ 5 6 7 8]]

 [[13 14 15 16]
 [17 18 19 20]]

 [[25 26 27 28]
 [29 30 31 32]]] (3, 2, 4)
b[::, 0],b[::, 1],b[::, -1],b[::, 0:2:]
[[ 1 2 3 4]
 [13 14 15 16]
 [25 26 27 28]] (3, 4)
[[ 5 6 7 8]
 [17 18 19 20]
 [29 30 31 32]] (3, 4)
[[ 9 10 11 12]
 [21 22 23 24]
 [33 34 35 36]] (3, 4)
[[[ 1 2 3 4]
 [ 5 6 7 8]]

 [[13 14 15 16]
 [17 18 19 20]]

 [[25 26 27 28]
 [29 30 31 32]]] (3, 2, 4)
b[:,:, 0],b[:,:, 1],b[:,:, -1],b[:,:, 0:2:]
[[ 1 5 9]
 [13 17 21]
 [25 29 33]] (3, 3)
[[ 2 6 10]
 [14 18 22]
 [26 30 34]] (3, 3)
[[ 4 8 12]
 [16 20 24]
 [28 32 36]] (3, 3)
[[[ 1 2]
 [ 5 6]
 [ 9 10]]

 [[13 14]
 [17 18]
 [21 22]]

 [[25 26]
 [29 30]
 [33 34]]] (3, 3, 2)

Process finished with exit code 0

以上示例中,数组 b 的形状为 shape=(3,3,4)。其第0维度包含3个元素,第1维度包含3个元素,第2维度包含4个元素(元素可以是单个值,也可以是数组,此处“元素”是相对于特定维度而言的)。

  • b[0, ::]、b[1, ::] 和 b[-1, ::] 分别提取了数组 b 在第0维度上的第0、第1和第-1个元素,每个提取结果均为一个二维数组。
  • b[0:2, ::] 提取了数组 b 在第0维度上的第0和第1两个元素,这两个元素均为二维数组,共同组成一个新的三维数组。
  • b[:, 0:]、b[:, 1:] 和 b[:, -1:] 分别提取了数组 b 的全部元素(均由4个元素的单个数组组成)、第1维度上除第0号外的所有元素(均由4个元素的单个数组组成)以及第1维度上所有最后一个位置上的元素(均由4个元素的单个数组组成)。
  • b[:, 0:2:] 提取了数组 b 在第1维度上的第0和第1两个元素,这两个元素均为包含4个元素的数组,共同组成一个新的三维数组。
  • b[::, 0]、b[::, 1] 和 b[::, -1] 分别提取了数组 b 在第2维度上的第0、第1和第-1个元素(此处元素即为包含4个元素的数组),每个提取结果均为包含4个元素的数组。
  • b[::, 0:2] 提取了数组 b 在第2维度上的第0和第1两个元素(此处元素即为包含4个元素的数组),这两个元素均为包含4个元素的数组。
  • b[:,:, 0]、b[:,:, 1] 和 b[:,:, -1] 分别提取了数组 b 在第2维度上所有元素(即包含4个元素的数组)中的第0、第1和第-1个元素值,每个提取结果均为单个元素值。
  • b[:,:, 0:2] 提取了数组 b 在第2维度上所有元素(即包含4个元素的数组)中的第0和第1两个元素值,这两个提取结果均为单个元素值。

以上为本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。