最近要做一个作业,用到了numpy的transpose函数,感觉理解起来不是很容易,记录一下。

理论角度

首先,学过线代的孩子们都知道,矩阵的转置就是行与列的变换嘛。没什么复杂的。比如一个矩阵

1
[1 2 3 4]

进行转置就成了

1
2
3
4
1
2
3
4

不复杂对吧。二维的也一样。

1
2
3
1 2 3 4
5 6 7 8
9 10 11 12

进行转置就是

1
2
3
4
1  5  9
2  6  10
3  7  11
4  8  12

如果是一个三维的呢? 有点蒙了。接下来是我的一点理解了。不一定准确,凑合来看。 ------------------昏隔--------------------- 矩阵也有坐标空间,比如一维的是x轴,y轴上为0,所以转置就是转到y轴上了。 二维的是x,y轴,转置就是相当于y=x的对称变换嘛。 到了三维,人就活到三维,所以就不好理解了。咋办?而且,如果你说转置怎么个映射办法? 还是对比二维。需要转置就是看对应的轴。如果一个轴不需要变换的话,就是给映射到平面上,然后做二维的变换。需要的话我就编不下去了。 ------------------昏隔---------------------

纯代码角度

来看! 拿一个二维矩阵

1
2
3
1 2 3 4
5 6 7 8
9 10 11 12

进行转置的话。 数字1的位置是(0,0),数字2的位置是(0,1),数字9的位置是(2,0) 进行转置的话就是把这个位置对调,结果就是: 数字1的位置是(0,0),数字2的位置是(1,0),数字9的位置是(0,2) 全部都这么一变,就成了

1
2
3
4
1  5  9
2  6  10
3  7  11
4  8  12

好了,直接上3维的。表示都是个难题。

1
2
3
4
5
6
7
8
9
[11  12  13
 14  15  16
 17  18  19]
[21  22  23
 24  25  26
 27  28  29]
[31  32  33
 34  35  36
 37  38  39]

如果我要找到28,它的位置是(0,2,1),32位置是(2,0,1) 可以看出,我们表示这个矩阵,需要三个值来表示,如果把位置当成数组来理解的话,下标值分别是0,1,2。 28就是这个

1
2
3
0 -> 0
1 -> 2
2 -> 1

32就是

1
2
3
0 -> 2
1 -> 0 
2 -> 1

这个地方理解了才能理解后面的具体操作。 通常,高维矩阵进行转置的时候,就是这么调用的

1
arr.transponse((2,0,1))

一看很乱。我们这样理解就好了 传递的参数就是下标的位置 0,1,2。需要按照它信给的顺序排序。 我原本的下表顺序是0,1,2,结果,现在要变成2,0,1。 我们再看上面的例子。 原来28的位置是(0,2,1),32位置是(2,0,1) 注意啊!我是要改变下标的位置,并不改变下标所对应的值。 28下标按0,1,2变成2,0,1就是(1,0,2),32就成了(1,2,0) 拿28举例子

1
2
3
0 -> 0  ---->>>  2 ->1
1 -> 2  ---->>>  0 ->0
2 -> 1  ---->>>  1 ->2

图示如下 matrix_transpose 就是带着值把下标位置挪到新的位置上。 说的有点乱,希望能够对于不理解的人有点启发吧。