TensorFlow索引与切片详解:从基础到高级用法

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

本文深入解析TensorFlow中索引与切片的核心机制。涵盖标准索引、逗号分隔索引及start:end:step切片语法,详解省略参数、负步长逆序读取及Ellipsis符号的高级应用。通过具体代码示例,帮助开发者高效提取张量数据,优化模型处理流程。

在TensorFlow中,索引与切片操作的使用频率极高,它们是提取和处理部分数据的关键工具。

TensorFlow索引操作基础

1. 索引操作

TensorFlow支持两种主要的索引方式:一是标准的[𝑖][𝑗]…链式索引,二是通过逗号分隔索引号的[x, y, z]索引方式。

为了便于理解,假设我们创建了一个包含4张大小为3*3的彩色图片的张量。


# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 提取出第一张图片
x[0]

<tf.Tensor: id=253, shape=(32, 32, 3), dtype=float32, numpy=
array([[[ 3.16146165e-01, 1.88969020e-02, 1.38413876e-01],
    [ 4.89341050e-01, 2.75277281e+00, 7.39786148e-01],
    [-1.25965345e+00, -2.69633114e-01, -1.16465724e+00],
    ...,


# 提取出第一张图片的第二行
x[0][1]

<tf.Tensor: id=261, shape=(32, 3), dtype=float32, numpy=
array([[ 7.4337220e-01, -1.0524833e+00, -2.6401659e-03],
    [ 5.3725803e-01, -9.5556659e-01, 4.9091709e-01],
    [-4.6934509e-01, 7.9289172e-03, -2.9179385e+00],
    [ 2.9324377e-01, 2.1451252e+00, -3.8849866e-01],
    [ 8.2027388e-01, -4.9701610e-01, -7.3374517e-02],
    ......

# 提取出第一张图片的第二行第三列的像素
x[0][1][2]

<tf.Tensor: id=273, shape=(3,), dtype=float32, numpy=array([-0.4693451 , 0.00792892, -2.9179385 ], dtype=float32)>

# 提取出第一张图片第二行第三列第二个用到(B通道)的颜色强度
x[0][1][2][2]

<tf.Tensor: id=289, shape=(), dtype=float32, numpy=-2.9179385>

当张量的维度较高时,使用[𝑖][𝑗]…[𝑘]的链式写法不仅繁琐且易出错,此时推荐使用[𝑖,𝑗, … , 𝑘]的逗号分隔索引方式,两者在功能上是等价的。


x[1, 9, 2] == x[1][9][2]

<tf.Tensor: id=306, shape=(3,), dtype=bool, numpy=array([ True, True, True])>

TensorFlow切片语法详解

2. 切片操作

通过start:end:step的切片语法可以便捷地提取连续数据段。其中,start指定起始索引,end指定结束索引(不包含该位置),step定义读取的步长。

继续以shape为[4, 32, 32, 3]的图片张量为例进行说明。


# 创建张量
x = tf.random.normal([4, 32, 32, 3])
# 读取第二张和第三张图片
x[1:3]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,
     [-5.0662726e-01, 6.9743747e-01, -5.8803167e-02],
     [ 1.4200432e+00, -5.0182146e-01, 5.1661726e-02],
     [ 3.5610806e-02, -2.4781477e-01, 1.8222639e-01]],

    [[ 1.3892423e+00, 1.1985755e+00, -6.4732605e-01],
     [ 8.5562867e-01, 1.2758574e+00, 1.7331127e+00],
     [ 9.7743452e-02, -5.3990984e-01, 8.3400911e-01],
     ...,

start:end:step切片提供了多种简写形式,start、end和step三个参数可根据需求选择性省略。若全部省略(即::),表示从起始位置读取至末尾,步长为1,即不跳过任何元素。例如,x[0,::]表示提取第1张图片的所有行数据,这里的::在行维度上表示读取所有行,这与直接写x[0]的效果完全一致。

因此,x[0, ::]在语义上等价于x[0]。

为了进一步简化书写,连续的冒号::可以简写为单个冒号:。


x[:, 0:28:2, 0:28:2, :]

<tf.Tensor: id=344, shape=(2, 32, 32, 3), dtype=float32, numpy=
array([[[[-3.4415385e-01, 5.8418065e-01, 1.8238322e-01],
     [ 5.3377771e-01, 5.8201426e-01, 1.2839563e+00],
     [-1.4592046e+00, -2.3443605e-01, -2.6524603e-01],
     ...,

上述示例展示了如何对所有图片进行隔行和隔列采样,同时保留所有通道信息。这种操作相当于将图片的高度和宽度各缩小至原来的一半。

以下是几种常见切片方式的总结:

值得注意的是,step参数允许为负数。例如,当step = -1时,start:end:-1表示从start开始逆序读取至end(不包含end),此时需满足索引号end ≤ start。


x = tf.range(9)

# 逆序输出
x[8:0:-1]
<tf.Tensor: id=31, shape=(8,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1])>

# 逆序取全部元素
x[::-1]
<tf.Tensor: id=35, shape=(9,), dtype=int32, numpy=array([8, 7, 6, 5, 4, 3, 2, 1, 0])>

# 逆序间隔采样
x[::-2]
<tf.Tensor: id=39, shape=(5,), dtype=int32, numpy=array([8, 6, 4, 2, 0])>

当处理高维张量时,对于不需要采样的维度,通常使用单冒号:来表示选取该维度上的所有元素。


x = tf.random.normal([4, 32, 32, 3])
# 提取所有图片的G通道
x[:,:,:,1]

<tf.Tensor: id=59, shape=(4, 32, 32), dtype=float32, numpy=
array([[[ 0.5700944 , 0.58056635, 2.2198782 , ..., -0.8475847 ,
     0.49761978, 0.28784937],
    [-0.22224228, 0.77950406, -0.01802959, ..., 0.55532527,
     0.6826188 , 0.50668514],
    [-2.4160695 , -0.96219736, 0.62681717, ..., 1.0348777 ,

为了避免出现如x[: , : , : ,1]这样冗长的冒号表达式,可以使用…(Ellipsis)符号来代表多个维度的所有数据。系统会根据规则自动推断…所代表的维度数量:当切片中出现…时,其左侧的维度会自动对齐到最左边,右侧的维度自动对齐到最右边,从而简化代码书写。


# 创建四张大小为32*32的彩色图片
x = tf.random.normal([4, 32, 32, 3])
# 读取第一张和第二张图片的G/B通道数据
x[0:2,...,1:]
# 读取最后两张图片
x[2,...]
# 读取所有图片的R/G通道
x[...,:2]

熟练掌握张量的索引与切片技巧,能够显著提升代码编写的效率与简洁性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

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

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 算法库。