pytorch、numpy的维度处理
一、Numpy
1.1 维度交换
【pytorch、numpy的维度处理】swapaxes。将数组n个维度中两个维度进行调换,不改变原数组据,resize可以改变原数组的数据。
import numpy as np
a = np.random.randint(1,10,(3,4))
print(a.shape)# out:(3,4)a = a.swapaxes(0,1)
print(a.shape)# out:(4,3)
1.2 增加维度
np.newaxis和np.expand_dims。只能添加shape为1的维度
import numpy as np
a = np.random.randint(1,10,(3,4))
print(a.shape)# out:(3,4)
# 第一种方式:添加第0维
a1 = a[np.newaxis, :]
print(a1.shape)# out:(1,3,4)
# 第二种方式:添加第1维
a2 = np.expand_dims(a, axis=1)
print(a2.shape)# out:(3,1,4)
1.3 删除维度
np.squeeze。只能删除shape为1的维度
- axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
- axis的取值可为
None
或int
或tuple of ints
, 可选。若axis为空,则删除所有单维度的条目;
import numpy as np
a = np.random.randint(1,10,(3,1,4))
print(a.shape)# out:(3,4)a = np.squeeze(a,axis = 1)
# 或:a = a.squeeze(axis = 1)print(a.shape)# out:(3,4)
1.4 拉直
import numpy as np
a = np.random.randint(1,10,(3,1,4))
print(a.shape)# out:(3,4)a = a.flatten()
print(a.shape)# out:(12,)
二、Pytorch 2.1 维度调整
view和reshape功能是一样的,先展平所有元素再按照给定shape排列,但是最终的总数量必须保持不变。
import torch
a = torch.rand(28,2,4,28)# 四维张量
print(a.shape)# out:torch.Size([28, 2, 4, 28])# 维度转换成一维,总大小不变
print(a.view(28,2*4,28).shape)# out:torch.Size([28, 8, 28])# -1 表示任意维度(pytorch根据,后面的维度自己推导,如总维度是 28*2*4*28=6272,此时-1代表的维度就是 6272 / 14 =448 )
print(a.view(-1,14).shape)# out:torch.Size([448, 14])
2.2 维度交换
transpose 实现两个维度相互交换
import torch
a = torch.rand(4,3,17,32)# 四维张量
# transpose 后需要接 contiguous 保证数据在内存的连续性
b = a.transpose(1,3).contiguous()
print(b.shape)# out:torch.Size([4, 32, 17, 3])
permute 实现任意维度的交换
import torch
a = torch.rand(4,3,17,32)
b = a.permute(0,3,1,2).contiguous() # 按各维度的索引进行排列
print(b.shape)# out:torch.Size([4, 32, 17, 3])
2.3 增加维度
unsuqeeze 。只能添加shape为1的维度
import torch
a = torch.rand(4,2,16,28)# out:torch.Size([4, 2, 16, 28])
print(a.shape)a1 = a.unsqueeze(0)# 最前面增加一个维度
a2 = a.unsqueeze(1)# 在第1,2个维度中间增加一个维度
a3 = a.unsqueeze(-1)# 在最后面增加一个维度print(a1.shape)# out:torch.Size([1, 4, 2, 16, 28])
print(a2.shape)# out:torch.Size([4, 1, 2, 16, 28])
print(a3.shape)# out:torch.Size([4, 2, 16, 28, 1])# 方法2:
a1 = a[None, ...]
2.4 删除维度
suqeeze 。只能删数shape为1的维度
import torch
a = torch.rand(4,2,28,17,1,1)# 四维张量
print(a.shape)# out:torch.Size([4, 2, 28, 17, 1, 1])a1 = a.squeeze()# 删除所有维度为1的维度
a2 = a.squeeze(4)# 删除指定位置维度为1的维度print(a1.shape)# out:torch.Size([4, 2, 28, 17])
print(a2.shape)# out:torch.Size([4, 2, 28, 17, 1])
2.5 重复维度
repeat就是将每个位置的维度都重复至指定的次数,以形成新的Tensor,功能与expand一样,但是repeat会重新申请内存空间,repeat()参数表示各个维度指定的重复次数。
import torch
a = torch.Tensor(1, 3, 1, 1)
print(a.shape)b = a.repeat(64, 1, 600, 800)# 3这里不想进行重复,所以就相当于"重复至1次"
print(b.shape)# out:torch.Size([64, 3, 600, 800])
推荐阅读
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- Shell-Bash变量与运算符
- 清明,是追思、是传承、是感恩。
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 七老修复好敏感、角质层薄、红血丝
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 螃蟹和这些食物同吃,轻则腹泻、重则中毒!要小心哦~
- 八、「料理风云」