pytorch与numpy中维度顺序转换的比较

pytorch

 

tensor.permute(dims)

将tensor的维度换位。

参数:参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimension。

例:

import torch

a = torch.rand(8,256,256,3)   #---> n,h,w,c
print(a.shape)

b = a.permute(0,3,1,2)  # ---> n,c,h,w
print(b.shape)

输出:

torch.Size([8, 256, 256, 3])
torch.Size([8, 3, 256, 256])

 


numpy

 

numy.transpose(a,axis =None)

参数 a : 输入数组 
axis :  int类型的列表,这个参数是可选的。默认情况下,反转的输入数组的维度,当给定这个参数时,按照这个参数所定的值进行数组变换。 
返回值 p : ndarray 返回转置过后的原数组的视图。

import numpy as  np

x = np.random.randn(8,256,256,3)  # ---> n,h,w,c
print(x.shape)
y=x.transpose((0,3,1,2))   #  ----> n,c,h,w
print(y.shape)

输出:

(8, 256, 256, 3)
(8, 3, 256, 256)

 

 

transpose 的原理其实是根据维度(shape)索引决定的

例:

import numpy as  np

x = np.arange(4).reshape((2,2)) #生成一个2x2的数组
print(x)

[[0 1]
 [2 3]]

生成了一个维度为二维数组,其中有两个索引值(矩阵的行与列)。

transpose()函数的作用就是调换数组的行列值的索引值,类似于求矩阵的转置:

x = np.arange(4).reshape((2,2))

x = np.transpose(x)

print(x)

[[0 2]

 [1 3]]

我们可以直观的看到,数组的行列索引值对换,1的位置从x(0,1)跑到了x(1,0)。

那么三维数组呢?

我们继续生成一个三维的数组:

x = np.arange(12).reshape((2,2,3)) //生成一个2x2x3的数组

print(x)

[[[ 0  1  2]

  [ 3  4  5]]

[[ 6  7  8]

  [ 9 10 11]]]

从高中数学知道三维由x轴、y轴以及z轴组成。

假设三维数组当中的索引值为x,y,z

transpose()函数的作用就是调换x,y,z的位置,也就是数组的索引值。

所以正常的数组索引值为(0,1,2),等于(x,y,z)

我们来看实例代码:

x = np.arange(12).reshape((2,2,3))

print(x)

[[[ 0 1 2]

[ 3 4 5]]

[[ 6 7 8]

[ 9 10 11]]]


x = np.transpose(x,(1,0,2)) //transpose()函数的第二个参数就是改变索引值的地方

print(x)

[[[ 0 1 2]

[ 6 7 8]]

[[ 3 4 5]

[ 9 10 11]]]

通过transpose()函数改变了x的索引值为(1,0,2),对应(y,x,z)

索引改变后原本y的值和x的值对换了。

有上面代码的数字7为例,原本的7的位置索引为(1,0,1),通过transpose(x,(1,0,2))索引改变为(0,1,1)

无论四维、五维……都可以用这个原理分析。

 

 

 

你可能感兴趣的:(pytorch,pytorch,numpy,permute,tranpose)