深度学习(7)TensorFlow基础操作三: 索引与切片

  • 一. 基础索引
    • 1. Basic indexing
    • 2. Numpy-style indexing
    • 3. start : end
    • 4. 切片索引(1)Indexing by “ : ”
    • 5. 切片索引(2)Indexing by “ : : ”
    • 6. 切片索引(3)Indexing by “ : : -1”
    • 7. 切片索引(4)Indexing by “ … ”
  • 二. 选择性索引
    • 1. tf.gather
    • 2. tf.gather_nd
    • 3. tf.boolean_mask

一. 基础索引

Indexing

  • Basic indexing

    • [idx][idx][idx]
  • Same with Numpy
  • [idx, idx, …]
  • start : end
  • start : end : step

1. Basic indexing

(1) a = tf.ones([1, 5, 5, 3]): 创建一个元素值全为1的4维Tensor,可以这样理解: 共有1个任务,每个任务重有5个矩阵,每个矩阵的维度为5行3列;
(2) a[0][0]: 取出a中第1个任务中的第1个矩阵,即:
(111111111111111)\begin{pmatrix}1&1&1\\1&1&1\\1&1&1\\1&1&1\\1&1&1 \end{pmatrix}⎝⎜⎜⎜⎜⎛​11111​11111​11111​⎠⎟⎟⎟⎟⎞​
所以,这个a[0][0]的shape=(5, 3);
(3) a[0][0][0]: 取出a中第1个任务中的第1个矩阵中的第1行,即:
[111]\begin{bmatrix}1&1&1 \end{bmatrix}[1​1​1​]
所以,这个a[0][0][0]的shape=(3,);
(4) a[0][0][0][2]: 取出a中第1个任务中的第1个矩阵中的第1行中的第3个元素,即:
111
所以,这个a[0][0][0][2]的shape=();

  • 缺点: 读取不灵活。

2. Numpy-style indexing

(1) a = tf.random.normal([4, 28, 28, 3]): 创建一个4维Tensor,可以这样理解: 一个batch里共有4张图片,每张图片为28×28,图片为彩色图片,所以通道数为3;
(2) a[1].shape: 这个batch中的第2张照片的shape为[28, 28, 3];
(3) a[1, 2].shape: 这个batch中的第2张照片的第3行有3个RGB的数值,其shape为[28, 3];
(4) a[1, 2, 3].shape: 这个batch中的第2张照片的第3行第4列有1个RGB数值,其shape为[3];
(5) a[1, 2, 3, 2].shape: 这个batch中的第2张照片的第3行第4列RGB数值中的B通道,也就是蓝色,其shape为[];

3. start : end

(1) a = tf.range(10): 创建一个0~9的Tensor;
(2) a[x: y]: 取出a中从x开始到y(不包括y)的所有元素;
(3) a[-1:]: 取出a中从倒数第1个元素到最后1个元素,就是最后一个元素它自己,即[9];
(4) a[-2:]: 取出a中从倒数第2个元素到最后1个元素,即[8, 9];
(5) a[:2]: 取出a中从第1个元素到第3个元素(不包括第3个元素),即[0, 1];
(6) a[:-1]: 取出a中从第1个元素到倒数第1个元素(不包括最后1个元素),即[0, 1, 2, 3, 4, 5, 6, 7, 8];

4. 切片索引(1)Indexing by “ : ”

(1) a[0, : , : , :].shape: 取出第1张照片中的所有数据,就是[28, 28, 3];
(2) a[0, : , : , :].shape: 取出第1张照片中的所有数据,就是[28, 28, 3];
(3) a[0, 1, : , :].shape: 取出第1张照片中的第2行的所有数据,就是[28, 3];
(4) a[: , : , : , 0].shape: 取出R(红色)通道的所有4张照片中的数据,就是[4, 28, 28];
(5) a[: , : , : , 2].shape: 取出B(蓝色)通道的所有4张照片中的数据,就是[4, 28, 28];
(6) a[: , 0, : , :].shape: 取出所有照片中的第2行的所有数据,就是[4, 28, 3];

5. 切片索引(2)Indexing by “ : : ”