索引与切片在Tensorflow中使用的频率极其高,可以用来提取部分数据。
在TensorFlow中,支持基本的[& # 119894;][& # 119895;]…标准索引方式,也支持通过逗号分隔索引号的索引方式。
假设创建四张大小为3 * 3的彩色图片。
#创建张量 x=tf.random。正常([4,32 32 3]) #提取出第一张图片 x [0] & lt; tf。形状张量:id=253=(32岁,32岁,3),dtype=float32 numpy=e-01数组([[[3.16146165,1.88969020 e-02 1.38413876 e-01], e + 00 e-01 (4.89341050, 2.75277281, 7.39786148 e-01], [-1.25965345 e + 00, -2.69633114 e-01, -1.16465724 e + 00), ..., #提取出第一张图片的第二行 x [0] [1] & lt; tf。形状张量:id=261=(32岁,3),dtype=float32 numpy=e-01阵列([[7.4337220,-1.0524833 e + 00, -2.6401659 e 03], e-01 e-01 (5.3725803, -9.5556659, 4.9091709 e-01], e 03 e-01 (-4.6934509, 7.9289172, -2.9179385 e + 00), e + 00 e-01 (2.9324377, 2.1451252, -3.8849866 e-01], e-01 e-01 (8.2027388, -4.9701610, -7.3374517 e-02], …… #提取出第一张图片的第二行第三列的像素 x [0] [1] [2] & lt; tf。形状张量:id=273=(3) dtype=float32 numpy=数组((-0.4693451,0.00792892,-2.9179385),dtype=float32)比; #提取出第一张图片第二行第三列第二个用到(B通道)的颜色强度 x [0] [1] [2] [2] & lt; tf。形状张量:id=289=(), dtype=float32 numpy=-2.9179385比; >之前当张量的维度数较高时,使用[& # 119894;][& # 119895;]。[& # 119896;]的方式书写不方便,可以采用[& # 119894;& # 119895;…,& # 119896;]的方式索引,它们是等价的。
x [1 9 2]==x [1] [9] [2] & lt; tf。形状张量:id=306=(3) dtype=bool, numpy=数组((真的,真的,真的))比; >之前
通过& # 119904;& # 119905;& # 119886;& # 119903;& # 119905;:& # 119890;& # 119899;& # 119889;:& # 119904;& # 119905;& # 119890;& # 119901;切片方式可以方便地提取一段数据,其中开始为开始读取位置的索引,最终为结束读取位置的索引(不包含结束位),步骤为读取步长。
还是以形状为[4,32岁,32岁,3]的图片张量为例。
#创建张量 x=tf.random。正常([4,32 32 3]) #读取第二张和第三张图片 x [1:3] & lt; tf。形状张量:id=344=(2, 32岁,32岁,3),dtype=float32 numpy=e-01阵列([[[[-3.4415385,5.8418065 e-01 1.8238322 e-01], e-01 e-01 (5.3377771, 5.8201426, 1.2839563 e + 00), e-01 [-1.4592046 e + 00, -2.3443605, -2.6524603 e-01], ..., e-01 e-01 (-5.0662726, 6.9743747, -5.8803167 e-02], e-01 [1.4200432 e + 00, -5.0182146, 5.1661726 e-02], e-01 e-02 (3.5610806, -2.4781477, 1.8222639 e-01]], [[1.3892423 e + 00, 1.1985755 e + 00, -6.4732605 e-01], e + 00 e-01 (8.5562867, 1.2758574, 1.7331127 e + 00), e-01 e-02 (9.7743452, -5.3990984, 8.3400911 e-01], …,开始:结束:一步切片方式有很多简写方式,其中开始,结束,步骤3个参数可以根据需要选择性地省略,全部省略时即::,表示从最开始读取到最末尾,步长为1,即不跳过任何元素,如x[0,::]表示读取第1张图片的所有行,其中::表示在行维度上读取所有行,它等于x[0]的写法。
即x[0,::]等价于x [0]。
为了更加简洁,::可以简写成为单个冒号。
x (:, 0:28:2 0:28:2:] & lt; tf。形状张量:id=344=(2, 32岁,32岁,3),dtype=float32 numpy=e-01阵列([[[[-3.4415385,5.8418065 e-01 1.8238322 e-01], e-01 e-01 (5.3377771, 5.8201426, 1.2839563 e + 00), e-01 [-1.4592046 e + 00, -2.3443605, -2.6524603 e-01], ..., >之前上述表示取所有图片,隔行采样,隔列采样,采集所有通道信息。相当于在图片的高宽各放缩至原来的一半。
下面是一些常见的切片方式小结:
特别地,一步可以为负数例。如:一步=& # 8722;1时,开始:结束:& # 8722;1表示从开始开始,逆序读取至结束结束(不包含结束),索引号& # 119890;& # 119899;& # 119889;≤& # 119904;& # 119905;& # 119886;& # 119903;& # 119905;。
x=tf.range (9) #逆序输出 x(译者注:1) & lt; tf。形状张量:id=31日=(8日),dtype=int32, numpy=数组([8、7、6、5、4、3、2、1])的在 #逆序取全部元素 x (:: 1) & lt; tf。张量:id=35、形状=(9日),dtype=int32, numpy=数组([8、7、6、5、4、3、2、1、0])的在 #逆序间隔采样 x [:: 2] & lt; tf。张量:id=39、形状=(5)dtype=int32, numpy=数组([8、6、4、2、0])在TensorFlow索引与切片的实现方法