转自知乎观海云远的文章,做了部分的删改。
3维数组的小例子:
import numpy as np
t = np.arange(1,17).reshape(2, 2, 4)
print(t)
三维数组为:
[[[ 1 2 3 4]
[ 5 6 7 8]]
[[ 9 10 11 12]
[13 14 15 16]]]
使用转置函数:
t1 = t.transpose(1, 0, 2)
print(t1)
转置结果为:
[[[ 1 2 3 4]
[ 9 10 11 12]]
[[ 5 6 7 8]
[13 14 15 16]]]
上述结果初看较难直观理解。下文采用图示的方法对该函数进行解释。
高维数组在座标系下的位置
三个维度(2, 2, 4)的index分别为0, 1, 2,即(2(第0维), 2(第1维), 4(第2维))。 如果建立如下座标系:
图1 标准座标系
在该座标系内可视化三维数组t
:
图2 标准座标系下的三维数组t
在0轴上,[[1,2,3,4],[5,6,7,8]]下标为0,而[[9,10,11,12],[13,14,15,16]]的下标为1,所以两个子矩阵在0轴按先后顺序排列,绿色矩阵在0轴座标0处,蓝色矩阵在0轴座标1处。
在1轴上,[1,2,3,4]下标为0,[5,6,7,8]下标为1;[9,10,11,12]下标为0,[13,14,15,16]下标为1
在2轴上,1的下标为0,2的下标为1并依次类推,同样5的下标为0,6的下标为1,并依次类推,9,10,11,12与13,14,15,16也是类似。
座标轴交换
语句t1 = t.transpose(1, 0, 2)
相当于把0轴和1轴位置进行了交换,2轴位置没有变化。
对比一下:t: (0, 1, 2)
→ t1: (1, 0, 2)。
调整方向后的新座标系如下图所示(注意0轴、1轴的位置):
图3 交换0轴、1轴后的新座标系
在新座标系方向下,数组t
的位置摆放可视化结果为:
图4中数组t仍按(2, 2, 4)对应(0轴, 1轴, 2轴)的方向摆放。
直观对比一下数组t在原座标系和新座标系下
的视觉变化。
关键的一步:将数组在新座标系下的摆放,原封不动地挪到原座标系下,即得到了座标轴变换后的新数组。
可以看出,在原座标系下新摆放的数组为:
[[[ 1 2 3 4]
[ 9 10 11 12]]
[[ 5 6 7 8]
[13 14 15 16]]]
进一步地,考虑3个轴都发生变化的情况:
t2 = t.transpose(2, 0, 1)
新旧座标系对比:t: (0, 1, 2)
→ t1: (2, 0, 1)
.
图7 新旧座标系对比
数组t
在新座标轴下的摆放:
前后摆放对比如图9:
图9
将新的摆放位置放至原座标系下的可视化结果:
运行验证一下:
t2 = t.transpose(2, 0, 1)
print(t2)
结果为:
[[[ 1 5]
[ 9 13]]
[[ 2 6]
[10 14]]
[[ 3 7]
[11 15]]
[[ 4 8]
[12 16]]]