TensorFlow索引与切片的实现方法

  

索引与切片在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],   ...,      之前      

上述表示取所有图片,隔行采样,隔列采样,采集所有通道信息。相当于在图片的高宽各放缩至原来的一半。
  

  

下面是一些常见的切片方式小结:

  

 TensorFlow索引与切片的实现方法

  

特别地,一步可以为负数例。如:一步=& # 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索引与切片的实现方法