关于 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与此类似。

浙公网安备 33010602011771号