一、组织张量的元素

(1)重排张量元素

本节介绍在不改变 张量元素个数 和 各元素的值的情况下改变张量的大小

torch.Tensor类的成员方法 reshape()

参数是多个int类型的值。

如果想要把一个张量的大小改成 s[0],s[1],s[2],s[3]....那就让s[0],s[1],s[2],s[3]....作为reshape() 方法的n个参数

使用 reshape()  在不改变元素个数和各元素的值的情况下改变张量大小

tc = torch.arange(12) #张量大小 (12,)
print('tc={}'.format(tc))
t322 = tc.reshape(3,2,2) #张量大小 (3,2,2)
print('t322={}'.format(t322))
t43 = t322.reshape(4,3) #张量大小(4,3)
print('t43={}'.format(t43))
tc=tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
t322=tensor([[[ 0, 1],
[ 2, 3]], [[ 4, 5],
[ 6, 7]], [[ 8, 9],
[10, 11]]])
t43=tensor([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])

在reshape() 参数里,1个维度的大小用 -1 代替。如果某个维度的大小用-1代替,那么该函数就会根据张量总元素的个数 和 其他各维度的元素个数 自动计算这个用 -1指定的维度大小

例如:

t =  torch.arange(24).reshape(2,-1,4)
print(t)
tensor([[[ 0,  1,  2,  3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]], [[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])

squeeze() 可以消除张量大小中大小为1的维度

t1 =  torch.arange(24).reshape(2,1,3,1,4)
print(t1.squeeze()) #消去一维后,大小为 (2,3,4)
tensor([[[ 0,  1,  2,  3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]], [[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])

unsqueeze()  增加一些大小为0的维度,增加的维度的位置由关键字参数 dims 指定

t2 =  torch.arange(24).reshape(2,3,4)
print(t2.unsqueeze(dim=2))
tensor([[[[ 0,  1,  2,  3]],

         [[ 4,  5,  6,  7]],

         [[ 8,  9, 10, 11]]],

        [[[12, 13, 14, 15]],

         [[16, 17, 18, 19]],

         [[20, 21, 22, 23]]]])

(2)张量的交换

张量的交换是将张量的各维度重新排列

permute () 交换

tt = torch.arange(24).reshape(1,2,3,4)   #大小 = (1,2,3,4)
print(tt.permute(dims=[2,0,1,3])) #大小 = (3,1,2,4) 即:交换原维度的第2 ..0 ..1..3。。。个维度

transpose() 转置      t()  二维张量装置

t12 = torch.tensor([[5.,-9.],])
print('t12={}'.format(t12))
t21 = t12.transpose(0,1)
print('t21={}'.format(t21))
t21 = t12.t()
print('t21={}'.format(t21))
t12=tensor([[ 5., -9.]])
t21=tensor([[ 5.],
[-9.]])
t21=tensor([[ 5.],
[-9.]])

(3)选取部分张量元素

 index_select() 

这个成员方法有两个参数 ———— 参数dim 是一个int 值 —— 表示对 哪个维度进行处理

参数index —— 是一个 torch.Tensor 实例,表示选取那个维度的哪些指标

例如: 调用index_select() 的torch.Tensor() 类实例的大小为(s[0]...s[x]..s[n-1]),dim = 1,index = (x,) 那么选取得到的张量大小 为(s[0]....s[x-1],x,s[x+1]...s[n-1])

t = torch.arange(24).reshape(2,3,4)  #大小 = {2,3,4}
index = torch.tensor([1,2]) #大小 (2,)
print(t.index_select(1,index)) #大小 = {2,2,4}
tensor([[[ 4,  5,  6,  7],
[ 8, 9, 10, 11]], [[16, 17, 18, 19],
[20, 21, 22, 23]]])

要对张量的某个维度进行选取 ———— 也可以用  [] ———— 需要给出在所有维度上的指标。在每个维度上,可以选取1个指标、多个指标【包括全部指标】。

t = torch.arange(12)
print(t)
print(t[3]) #选取1个元素,大小(),值为3
print(t[-5]) #选取1个元素,大小(),值为7
print(t[3:6]) #选取连续元素,大小(3,)
print(t[:6]) #选取连续元素,大小(6,)
print(t[3:]) #选取连续元素,大小(9,)
print(t[-5:]) #选取连续元素,大小(5,)
print(t[3:6:2]) #选取不连续元素,大小(2,)
print(t[3::2]) #选取不连续元素,大小(5,)
tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
tensor(3)
tensor(7)
tensor([3, 4, 5])
tensor([0, 1, 2, 3, 4, 5])
tensor([ 3, 4, 5, 6, 7, 8, 9, 10, 11])
tensor([ 7, 8, 9, 10, 11])
tensor([3, 5])
tensor([ 3, 5, 7, 9, 11])

对于有多个维度的情况,可以用英文"," 分割各个维度的指标

t = torch.arange(12).reshape(3,4)
print(t)
print(t[2:,-2]) #大小(1,) 值为[10,]
print(t[0,:]) #大小(4,) 值为[0,1,2,3]
tensor([[ 0,  1,  2,  3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([10])
tensor([0, 1, 2, 3])

 masked_select() 

接受一个张量参数 mask,它的大小必须调和 用masked_selected()  方法的类实例相同,并且元素类型必须为 torch.int8

张量mask 里面的元素非0即1,表示是否要选择对应元素

masked_selected()  将张量mask 选定的那些值以一个一维张量的形式返回,一维张量的元素个数就是张量mask 中1的个数

t = torch.arange(12).reshape(3,4)
mask = torch.tensor([[1,0,0,1],[0,1,1,0],[0,0,1,0]],dtype=torch.uint8)
t.masked_select(mask) #大小(5,)
tensor([ 0,  3,  5,  6, 10])

take()

不再考虑张量的具体大小,而只考虑张量的元素总个数

take() 函数将张量个元素按照唯一的指标进行索引,相当于对经过 reshape(-1) 操作后的张量进行索引

t = torch.arange(12).reshape(3,4)
print(t)
indices = torch.tensor([2,5,6])
print(indices)
print(t.take(indices)) #大小(3,) 值为[2,5,6]
tensor([[ 0,  1,  2,  3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
tensor([2, 5, 6])
tensor([2, 5, 6])

(4)张量的扩展和拼接

repeat() 

可以将张量的内容进行重复,使张量的大小变大

(s[0],s[1]....s[n-1]) —— repeat() ———> (s[0]r[0],s[1]r[1]....s[n-1]r[n-1])

t12 = torch.tensor([[5.,-9.],])
print('t12={}'.format(t12)) #大小(1,2)
t34 = t12.repeat(3,2)
print(t34) #大小(3,4) 1*3 = 3 2*2 =4
t12=tensor([[ 5., -9.]])
tensor([[ 5., -9., 5., -9.],
[ 5., -9., 5., -9.],
[ 5., -9., 5., -9.]])

torch.cat() 

tp = torch.arange(12).reshape(3,4)
tn = -tp
tc0 = torch.cat([tp,tn],0)
print(tc0)
tc1 = torch.cat([tp,tp,tn,tn],1)
print(tc1)
tensor([[  0,   1,   2,   3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, -1, -2, -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]])
tensor([[ 0, 1, 2, 3, 0, 1, 2, 3, 0, -1, -2, -3, 0, -1,
-2, -3],
[ 4, 5, 6, 7, 4, 5, 6, 7, -4, -5, -6, -7, -4, -5,
-6, -7],
[ 8, 9, 10, 11, 8, 9, 10, 11, -8, -9, -10, -11, -8, -9,
-10, -11]])

torch.stack()

同样有 张量列表(或元组)和 维度两个参数

stack() 函数要求输入张量的大小完全相同,得到的张量的维度会比输入的张量的大小多1,并且多出的那个维度就是拼接的维度

tp = torch.arange(12).reshape(3,4)
tn = -tp
ts0 = torch.stack([tn,tp],0)
print(ts0)
ts1 = torch.stack([tp,tp,tn,tn],1)
print(ts1)
tensor([[[  0,  -1,  -2,  -3],
[ -4, -5, -6, -7],
[ -8, -9, -10, -11]], [[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]])
tensor([[[ 0, 1, 2, 3],
[ 0, 1, 2, 3],
[ 0, -1, -2, -3],
[ 0, -1, -2, -3]], [[ 4, 5, 6, 7],
[ 4, 5, 6, 7],
[ -4, -5, -6, -7],
[ -4, -5, -6, -7]], [[ 8, 9, 10, 11],
[ 8, 9, 10, 11],
[ -8, -9, -10, -11],
[ -8, -9, -10, -11]]])

最新文章

  1. Linux 虚拟机和物理机配互信出现无法连接
  2. [原创]PostgreSQL Plus Advanced Server批量创建分区表写入亿级别数据实例
  3. html <input>标签类型属性type(file、text、radio、hidden等)详细介绍
  4. POJ 1062 昂贵的聘礼 解题报告
  5. 对discuz的代码分析学习(一)目录结构
  6. CI(codeigniter)框架,routes.php设置正确,但是显示服务器错误,是__construct少写了一个下划线
  7. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
  8. Docker(4):Docker集中化web界面管理平台—Shipyard部署
  9. luoguo 1306 斐波那契公约数
  10. Elasticsearch 5.4.3实战--Java API调用:搜索
  11. STL基础1:vector
  12. form表单序列化为json格式数据
  13. VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)
  14. SSH框架整合jar包时的注意事项
  15. Qt5发布错误01
  16. VirtualBox的端口映射其实很好理解
  17. 14.Android UiAutomator 图像处理
  18. tableview的两个重用cell方法
  19. bzoj2761: [JLOI2011]不重复数字(hash)
  20. [转载]java调用PageOffice生成word

热门文章

  1. STARTUPINFO结构体
  2. supdf
  3. 同余&逆元简单总结
  4. VM删除快照失败,磁盘空间不足,只是删除了快照名字(全网唯一解决办法)
  5. vue 中监听窗口发生变化,触发监听事件, window.onresize && window.addEventListener('resize',fn) ,window.onresize无效的处理方式
  6. CSS3 的背景属性
  7. 【HDOJ5943】Kingdom of Obsession(数论)
  8. 关于多个py文件生成一个可运行exe文件(用pyinstaller)
  9. [LOJ2538][PKUWC2018]Slay the Spire:DP
  10. LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)