1. Numpy.transpose
如图,通过Print(three.shape), 可知原始的 original three :
1.1 原始numpy 中每个维度上意义
three.shape = (2, 4, 3)
第一个数,代表矩阵个数 Num_matrix = 2,
第二个数,代表单个矩阵中的行数 row = 4;
第三个数,代表单个矩阵中的列数 col = 3;
那么当使用numpy.transpose(x1,x2,x3),x1, x2, x3 没有使用正常顺序排列时,则代表各个逆序的位置上的数值改变, 也就是说该位置上元素代表的意义没有改变,只不过的数值上发生改变。
1.2 transpose 中每个维度上意义
而当出现 transpose 时, 代表的是需要进行置换的维度;
Numpy.transpose(2,1,0):
使用以上transpose之后,想要改变两部分的内容,即矩阵的个数 和 单个矩阵中的列数
改变后矩阵的个数 = 原始 Original three 中列数
改变后 单个矩阵中的列数 = 原始original three 中矩阵的个数。
明白的说,
1:原来的 original three(2,4,3)代表的是有2 个 4 * 3 的矩阵,
2:通过numpy.transpose (2, 1, 0) 想要将原始的第0个位置上的数 和第2个位置上的数互换. 将变成 three(3,4,0);
3:变换之后,得到 3 个 4 * 2 的矩阵;
有人可能会问,由2个4 * 3 的矩阵,变换成 3个4 * 2 的矩阵时候,在组成第一新的矩阵时, 为什么不直接取原始第一个矩阵中的连续两列,来形成一个新矩阵。
答: 由2个4*3 的矩阵,变换成 3个4 * 2 的矩阵时, 单个矩阵的行数是没有变的,又想从两个矩阵变成三个矩阵, 而原始单个矩阵中只有3列,如果每次取2列,取三次是不够的,所以从每个矩阵取一列。
同理,numpy.transpose(1, 0 , 2) 想要达到的目的是:将原始总矩阵的数目 和 原始单个矩阵的行数, 这两个数值进行互换。
2. tensor.permute
将tensor的维度换位。
参数: - dims (int …*) - 换位顺序
2.1 实例
>>> x = torch.randn(2, 3, 5)
>>> x.size()
torch.Size([2, 3, 5])
>>> x.permute(2, 0, 1).size()
torch.Size([5, 2, 3])
2.2 transpose 与permute 的区别
permute相当于可以同时操作于tensor的若干维度,transpose只能同时作用于tensor的两个维度;
- torch.transpose(Tensor, a,b):transpose只能操作2D矩阵的转置,有两种调用方式;
另:连续使用transpose也可实现permute的效果:
>>torch.randn(2,3,4,5).transpose(3,0).transpose(2,1).transpose(3,2).shape
torch.Size([5, 4, 2, 3])
>>torch.randn(2,3,4,5).transpose(1,0).transpose(2,1).transpose(3,1).shape
torch.Size([3, 5, 2, 4])
- Tensor.permute(a,b,c,d, …):permute函数可以对任意高维矩阵进行转置,但没有 torch.permute() 这个调用方式, 只能 Tensor.permute():
>>> torch.randn(2,3,4,5).permute(3,2,0,1).shape
torch.Size([5, 4, 2, 3])