即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),索引号𝑒𝑛𝑑 ≤ 𝑠𝑡𝑎𝑟𝑡。
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 ,
为了避免出现像𝑥[: , : , : ,1]这样出现过多冒号的情况,可以使用⋯符号表示取多个维度上所有的数据,其中维度的数量需根据规则自动推断:当切片方式出现⋯符号时,⋯符号左边的维度将自动对齐到最左边,⋯符号右边的维度将自动对齐到最右边,此时系统再自动推断⋯符号代表的维度数量。

# 创建四张大小为32*32的彩色图片 x = tf.random.normal([4, 32, 32, 3]) # 读取第一张和第二张图片的G/B通道数据 x[0:2,...,1:] # 读取最后两张图片 x[2,...] # 读取所有图片的R/G通道 x[...,:2]
掌握了张量的索引与切片之后,会让我们的书写更加快捷。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。










