TensorFlow——索引与切片操作

TensorFlow 的索引与切片操作

文章目录

  • TensorFlow 的索引与切片操作
    • 一.基本切片操作
    • 二. TensorFlow 自带的切片方法
      • 2.1-tf.gather
      • 2.2-tf.gather_nd
      • 2.3-tf.boolean_mask

一.基本切片操作

首先,TensorFlow有最基本的切片操作,这个和许多高级语言的方式一样。同时,TensorFlow与Numpy语法也兼容。可以直接照搬Numpy的切片和索引操作。

除了这些,TensorFlow也有其特有的切片方法。

二. TensorFlow 自带的切片方法

2.1-tf.gather

tf.gather(
    params,
    indices,
    validate_indices=None,
    name=None,
    axis=0
)#提取出params的第axis维度上在indices里面所有的index

我们假设有这么一组数据,表示[班级号,学生号,课程号]。如果,我们有4个班级,每个班级有35个学生,每个学生修8个课程。那么整体就会组成一个[4,35,8]的数据,存储在变量a当中。

TensorFlow——索引与切片操作_第1张图片

其中:

  • In[46]:axis=0正好对应班级号。于是这一行的意思就是:我想看班号为2,3这两个班的情况。返回的数据就是一个[2,35,8]的数据,In[47]意思一样。
  • in[49]部分,axis=1,对应的是学生号,也就是说,我想看每个班级的2,3,7,9,16号学生的情况,返回的就是[4,5,8]的数据。以此类推。

gather方法也可以组合使用。比如说:我想取每个班级前7个学生的,前三门课程的情况,我就可以这么写:

aa = tf.gather(a,axis=1,indices=[0,1,2,3,4,5,6]) # 把所有班级的前7个学生提出来
aaa = tf.gather(aa,axis=2,indices=[0,1,2])

2.2-tf.gather_nd

tf.gather_nd(
    params,
    indices,
    name=None
) # 含义与gather差不多,但是gather只能指定一个axis,在一个轴上索引,但在gather_nd当中可以进行多维索引

TensorFlow——索引与切片操作_第2张图片

  • In[60]:0班的情况,自然是有35个学生,每个学生修8个课程,于是shape是[35,8]

  • In[61]:0班1号同学的情况,这个同学自然是修8个课程,于是shape是[8]

  • In[62]:0班1号同学的2号课程,课程下面没有划分了,于是返回的shape是[]

  • In[63]:相当于a[a[0,1,2]],就相当于一个a[[]],这当中有一个元素:[]。所以返回一个1维的shape

TensorFlow——索引与切片操作_第3张图片

gather_nd支持多维索引,上面这些代码就是例子:

  • In[56]:查看0班0号同学,1班1号同学的情况,这是两个同学,每个同学修8门课程,所以shape为[2,8]

  • In[57]同理

  • In[58]查看0班0号同学0号课程,1班1号同学的1号课程,2班2号同学的2号课程,返回的是a[[],[],[]],即:a当中有三个元素(这三个元素都是[]),所以返回shape是[3]

  • In[59]:最后返回的是a[a[[],[],[]]],即a当中取一行,这一行有三个元素(三个元素都是[])这显然是一个一行三列的数据,所以shape是[1,3]

2.3-tf.boolean_mask

这个直接对标Numpy和Pandas当中的“遮罩”,利用bool类型,对某些元素进行“遮挡”。

TensorFlow——索引与切片操作_第4张图片
维数比较多,可能比较难想。你大可以像之前班级那个例子那样,想象一下某个情景:比如说In[75]的地方,你大可以想象成:4个班级,每个班级28个学生,每个学生评价有28个指标,每个指标分成3等。这样就可以把抽象的东西具体化。

  • In[76]:由于axis 默认是0,所以这么写就相当于取axis的前两个。返回的自然是[2,28,28,3]

  • In[77]:axis=3有3个属性。取前两个.

  • In[79]:注意,mask也是一个两行三列的,那么选取 出来的数据,一定是一个4个属性(因为选出来的肯定是最后一个axis的)。第一个[True, False, False]就相当于第0行只取第0个元素。第二个[False, True, True],就相当于取第1行的,第一,第二个元素。每个元素当中,由都包含4个1,所以最后返回的就是3行4列,全是1的矩阵。

你可能感兴趣的:(tensorflow)