关于 numpy 中的 transpose 和 swapaxes 的理解

三维数组中 transpose 到底是怎么实现的,先说一下置换轴吧:

比如说有一个数组 array:

array = np.arange(16).reshape(2,2,4)
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

这是一个三维数组,可以看到 0-7 和 8-15 之间是有间隔的。(三维数组可以看作是一个内涵二维数组作为元素的一维数组)

假设这个数组array存放在一个2*2*4的长方体中(实际存储肯定不是这样),左边的八个小正方体存的是0-7,右边是8-15。如图:

为了直观的看出来,把每一个4列一组的视为一个小方格。

开始置换轴吧。

三维向量,X轴用0表示,Y轴用1表示;Z轴用2来表示;

array.transpose((1,0,2))
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

transpose((1,0,2))  可以理解为 原长方体的宽做长,长做宽,高不变,那只需要把这个长方体旋转90度就好了,但是数据顺序怎么确定呢:

 注意:长、宽的方向如箭头所示,是不变的!!!

重新摆放一下小正方块就行了,然后你要记得左边的八个小正方块是第一个二维数组,右边八个是第二个二维数组,写出来即可。

但不可能每次都画长方体吧,我们把三维数组写成这样:

array([[[ 0,  1,  2,  3],[ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11], [12, 13, 14, 15]]])

从上到下是行,从左到右是列,列数是z轴。 现在把列做行,行做列,这不就是二维数组的转置了吗。

再看一下更复杂的情形:

array.transpose((2,0,1))
array([[[ 0,  8],
        [ 4, 12]],

       [[ 1,  9],
        [ 5, 13]],

       [[ 2, 10],
        [ 6, 14]],

       [[ 3, 11],
        [ 7, 15]]])

结果肯定是一个4*2*2的shape,这就相当于把长方体放倒了

保持好原方向(0在8前面)。大概就这么个意思吧,我发现也不知道我自己在说什么了,语无伦次。。。swapaxes与此类似。

 

 

 

 

 

 

posted @ 2021-11-11 20:49  凉天  阅读(252)  评论(0)    收藏  举报