[TensorFlow系列

您所在的位置:网站首页 tensorflow切片 [TensorFlow系列

[TensorFlow系列

#[TensorFlow系列| 来源: 网络整理| 查看: 265

 

目录

第1章 张量的索引与切片

1.1 张量的维度方向

1.2 张量元素的访问:下标

1.3. 张量元素的下标切片

1.4 索引切片的表达方式:

1.5 代码演示的前置条件

第2章 在一个维度方向上的切片操作(切片间通过冒号:分割)

2.1 正向获取连续的序列(保持原先顺序):默认步长为1

2.2 正向获取非连续的序列(保持原先顺序): 步长的使用

2.3 反向获取非连续的序列(保持原先顺序): 负数步长的使用

2.4 反/逆向获取非连续的序列(保持原先顺序): 负数步长的使用

第3章 在多个维度方向上的切片操作(维度间通过逗号,分割)

第4章 对部分维度的自动推动(省略号...的使用)

第1章 张量的索引与切片 1.1 张量的维度方向

 

[TensorFlow系列-17]:TensorFlow基础 - 张量的索引与切片_张量

 

1.2 张量元素的访问:下标

张量元素的标识a[Idx-x][Idx-y][Idx-z]

其中Idx-x,Idx-y,Idx-z就是张量在不同维度方向的位置下标,代表了张量元素在整个张量空间中的位置。 

1.3. 张量元素的下标切片

上述访问张量的方式称为下标访问,每次只能获取张量空间中的一个点。

如何访问张量空间中的多个顺序的元素呢?

这就涉及一个新的概念,张量下标索引的切片访问。

[TensorFlow系列-17]:TensorFlow基础 - 张量的索引与切片_Tensorflow_02

切片是针对某个维度方向下标访问的, 通过切片,一次可以访问多个顺序的元素,而不是唯一的元素。

每个维度方向上都可以进行各自独立的切片访问,最终可以得到的是分布在不同维度方向上的多个张量元素。

 

1.4 索引切片的表达方式:

[start : end : step]

通过三个参数和一个冒号“:”来定义切片的方式。

如下图所示:

[TensorFlow系列-17]:TensorFlow基础 - 张量的索引与切片_下标_03

 (1)元素的下标索引

正数:正向编码,从开始第一元素开始编号,从0开始到正无穷,      0表示启第一个元素 负数:反向编码,从最后一个元素开始编号,从-1开始,到负无穷,-1表示最后一个元素

(2)步长:

正数:表示索引的增长方向是正向的。 负数:表示索引的增长方向是逆向的。

备注:Pytorch不支持负数步长,Tensorflow支持

(3)开闭区间

start:是闭合区间,包含start索引的元素 end:是开合区间,不包含end索引的元素

 

1.5 代码演示的前置条件 #环境准备 import numpy as np import tensorflow as tf print("hello world") print("tensorflow version:", tf.__version__)

 

第2章 在一个维度方向上的切片操作(切片间通过冒号:分割) 2.1 正向获取连续的序列(保持原先顺序):默认步长为1 #代码示例: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,正向定位:有冒号, 有起始 =>[start: end) 半闭半开区间") #切取一段明确的、指定的、连续下标的元素序列 b = a[4] #没有冒号,取一个正向元素:起始闭合[4] print(b) b = a[6] #没有冒号,取一个正向元素:起始闭合[6] print(b) b = a[0:6] #有冒号,取正向序列[4,6) 半闭半开区间 => 起闭:a[4]和终开:a[5] print(b)

输出结果:

原张量 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 正向切片,正向定位:有冒号, 有起始 =>[start: end) 半闭半开区间 tf.Tensor(4, shape=(), dtype=int32) tf.Tensor(6, shape=(), dtype=int32) tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32) #代码示例2: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,正向定位:有冒号, 无起始,有终止 =>[: end) 半闭半开区间") b = a[:6] #有冒号,无起始,有终止,取正向序列:[0,6) 半开半闭区间 print(b)

输出:

原张量 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 切片后张量 tf.Tensor([0 1 2 3 4 5], shape=(6,), dtype=int32) #代码示例3: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,正向定位:有冒号, 有起始,无终止 =>[start:) 半闭半开区间") b = a[5:] #有冒号,有起始,无终止,取正向序列:[5,-) 半开半闭区间 print(b)

输出:

原张量 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 正向切片,正向定位:有冒号, 有起始,无终止 =>[start:) 半闭半开区间 tf.Tensor([5 6 7 8 9], shape=(5,), dtype=int32)

 

代码示例4: print("原张量:") a = torch.Tensor([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间") b = a[-1] #没有冒号,取一个逆向元素:[10-1] print(b) b = a[-2] #没有冒号,取一个逆向元素:[10-2] print(b) b = a[-4:-1] #有冒号,有始有终,取[-4,-1)半开半闭区间元素序列。 print(b) b = a[-4:] #有冒号,有始有终,取[-4,-)半开半闭区间元素序列。 print(b) print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,正向定位:有冒号, 无起始,无终止 =>[:) 半闭半开区间") b = a[:] #有冒号,无起始,无终止,取正向序列:[0,-)半开半闭区间 或 [0,-1]全闭区间 print(b)

输出:

原张量 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 正向切片,正向定位:有冒号, 无起始,无终止 =>[:) 半闭半开区间 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) # 代码示例5: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间") b = a[-1] #没有冒号,取一个逆向元素:[10-1] print(b) b = a[-2] #没有冒号,取一个逆向元素:[10-2] print(b) b = a[-4:-1] #有冒号,有始有终,取[-4,-1)半开半闭区间元素序列。 print(b) b = a[-4:] #有冒号,有始有终,取[-4,-)半开半闭区间元素序列。 print(b) 原张量: tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 正向切片,逆向定位:有冒号, 有起始 =>[start: end) 半闭半开区间 tf.Tensor(9, shape=(), dtype=int32) tf.Tensor(8, shape=(), dtype=int32) tf.Tensor([6 7 8], shape=(3,), dtype=int32) tf.Tensor([6 7 8 9], shape=(4,), dtype=int32)

 

2.2 正向获取非连续的序列(保持原先顺序): 步长的使用 #代码示例1: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n正向切片,指定步长") # 默认步长为1 b = a[2:8] #无步长冒号,默认为1 print(b) b = a[2:8:] #有步长冒号,无步长数值,默认为1 print(b) b = a[2:8:1] #有步长冒号,有步长数值:1 print(b) b = a[2:8:2] #有步长冒号,有步长数值:2 print(b) b = a[2:8:3] #有步长冒号,有步长数值:3 print(b)

输出:

原张量: tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 正向切片,指定步长 tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32) tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32) tf.Tensor([2 3 4 5 6 7], shape=(6,), dtype=int32) tf.Tensor([2 4 6], shape=(3,), dtype=int32) tf.Tensor([2 5], shape=(2,), dtype=int32)

 

#代码示例2: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n默认区间,默认步长") b = a[:] print(b) b = a[::] print(b) b = a[::1] print(b)

输出:

原张量: tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 默认区间,默认步长 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32)

 

2.3 反向获取非连续的序列(保持原先顺序): 负数步长的使用 # 代码示例: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n默认区间,反向默认步长") b = a[::1] print(b) b = a[::-1] print(b) 输出: 原张量: tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 默认区间,反向默认步长 tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) tf.Tensor([9 8 7 6 5 4 3 2 1 0], shape=(10,), dtype=int32)

 

2.4 反/逆向获取非连续的序列(保持原先顺序): 负数步长的使用 #代码示例: print("原张量:") a = tf.constant([0,1,2,3,4,5,6,7,8,9]) print(a) print("\n逆切片,指定步长") b = a[2:8:-1] #逆向步长,起始索引< 终止索引, 无序列 print(b) b = a[8:2:-1] #逆向步长,起始索引>终止索引, 有序列 print(b) b = a[-2:-8:-1] #逆向步长, print(b) b = a[-2:-8:-2] #逆向步长, print(b) b = a[-2:-8:-3] #逆向步长, print(b)

输出:

原张量: tf.Tensor([0 1 2 3 4 5 6 7 8 9], shape=(10,), dtype=int32) 逆切片,指定步长 tf.Tensor([], shape=(0,), dtype=int32) tf.Tensor([8 7 6 5 4 3], shape=(6,), dtype=int32) tf.Tensor([8 7 6 5 4 3], shape=(6,), dtype=int32) tf.Tensor([8 6 4], shape=(3,), dtype=int32) tf.Tensor([8 5], shape=(2,), dtype=int32)

 

第3章 在多个维度方向上的切片操作(维度间通过逗号,分割) #代码案例1: print("原张量:") a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]]) print(a) print("\n在axis=0的方向上切片:") b = a[0] print(b) b = a[2] print(b)

输出:

原张量: tf.Tensor( [[ 0 2 4 6 8 10] [ 1 3 5 7 9 11] [12 13 14 15 16 17]], shape=(3, 6), dtype=int32) 在axis=0的方向上切片: tf.Tensor([ 0 2 4 6 8 10], shape=(6,), dtype=int32) tf.Tensor([12 13 14 15 16 17], shape=(6,), dtype=int32)

 

# 代码案例2: print("原张量:") a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]]) print(a) print("\n在axis=0的方向上切片(一个维度方向):") b = a[1:2] print(b)

输出:

原张量: tf.Tensor( [[ 0 2 4 6 8 10] [ 1 3 5 7 9 11] [12 13 14 15 16 17]], shape=(3, 6), dtype=int32) 在axis=0的方向上切片: tf.Tensor([[ 1 3 5 7 9 11]], shape=(1, 6), dtype=int32)

 

#代码案例3: print("原张量:") a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]]) print(a) print("\n在axis=0和axis=1方向上切片(两个维度方向):") b = a[1:2, 3:5] print(b) print("\n在axis=0和axis=1方向上切片(两个维度方向):") b = a[1:3, 3:5] print(b)

输出:

原张量: tf.Tensor( [[ 0 2 4 6 8 10] [ 1 3 5 7 9 11] [12 13 14 15 16 17]], shape=(3, 6), dtype=int32) 在axis=0和axis=1方向上切片(两个维度方向): tf.Tensor([[7 9]], shape=(1, 2), dtype=int32) 在axis=0和axis=1方向上切片(两个维度方向): tf.Tensor( [[ 7 9] [15 16]], shape=(2, 2), dtype=int32)

 

第4章 对部分维度的自动推动(省略号...的使用) #代码示例1: print("原张量:") a = tf.constant([[0,2,4,6,8,10],[1,3,5,7,9,11],[12,13,14,15,16,17]]) print(a) print("\n在axis=0方向上切片,在axis=1方向省略(两个维度方向):") b = a[1:2, ...] # axis=0的切片为[1:2], axis=1省略,采用默认值 print(b) print("\n在axis=0方向省略,在axis=1方向上切片(两个维度方向):") b = a[...,1:2,] # axis=0省略,axis=1的切片为[1:2], 采用默认值 print(b)

输出:

原张量: tf.Tensor( [[ 0 2 4 6 8 10] [ 1 3 5 7 9 11] [12 13 14 15 16 17]], shape=(3, 6), dtype=int32) 在axis=0方向上切片,在axis=1方向省略(两个维度方向): tf.Tensor([[ 1 3 5 7 9 11]], shape=(1, 6), dtype=int32) 在axis=0方向省略,在axis=1方向上切片(两个维度方向): tf.Tensor( [[ 2] [ 3] [13]], shape=(3, 1), dtype=int32)

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3