索引与切片在Tensorflow中使用的频率极其高,可以用来提取部分数据。
1.索引
在 TensorFlow 中,支持基本的[𝑖][𝑗]…标准索引方式,也支持通过逗号分隔索引号的索引方式。
假设创建四张大小为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])>
2.切片
通过𝑠𝑡𝑎𝑟𝑡: 𝑒𝑛𝑑: 𝑠𝑡𝑒𝑝切片方式可以方便地提取一段数据,其中 start 为开始读取位置的索引,end 为结束读取位置的索引(不包含 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 3 个参数可以根据需要选择性地省略,全部省略时即::,表示从最开始读取到最末尾,步长为 1,即不跳过任何元素。如 x[0,::]表示读取第 1 张图片的所有行,其中::表示在行维度上读取所有行,它等于x[0]的写法。










