Python Numpy.transpose函数可视化解释

二维情况

例如以下代码:

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

输出:

x = ([[0, 1],
       [2, 3]])

对于二维的数组,np.transpose()即为将矩阵进行转置的意思
PS:对于矩阵的维度的表示: n ∗ m ∗ l n*m*l nml:有多少个数据相乘就是有多少维,而最终的乘积结果表示一共有多少个数据
为什么说二维数组中,np.transpose()就是矩阵转置呢?可以通过坐标法来解释这个问题
假设原数组如下:

([[0, 1],
       [2, 3]])

执行代码:

import numpy as np
x.transpose()

后,得到的数组为:


    ([[0, 2],
           [1, 3]])

原理如下:
不妨设第一个方括号“[]”为 0轴 ,第二个方括号为 1轴 ,则x可在 0-1坐标下表示:
Python Numpy.transpose函数可视化解释_第1张图片
PS:这里默认的书写方向都是这样:即按照数组内元素的位置来写。如下:

x[0][0] == 0
x[0][1] == 1
x[1][0] == 2
x[1][1] == 3

当执行transpose操作后,示意图如下:
Python Numpy.transpose函数可视化解释_第2张图片
可以看出,0轴和1轴交换了位置。可以理解为:
transpose = transaction + position
因此操作后的新数组为:

([[0, 2],
       [1, 3]])

PS:读取数据的时候还是按照数据的索引位置进行读取
注意,任何时候你都要保持清醒,告诉自己第一个方括号“[]”为 0轴 ,第二个方括号为 1轴
此时,transpose转换关系就清晰了。

三维情况

代码:

import numpy as np

# A是array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
A = np.arange(16)

# 将A变换为三维矩阵
A = A.reshape(2,2,4)
print(A)

输出:

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

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

表示成坐标形式如下:
Python Numpy.transpose函数可视化解释_第3张图片
PS:数字的排放仍旧是按照空间坐标位置书写

x[0][0][0] = 0
x[0][0][1] = 1
x[0][0][2] = 2
x[0][0][3] = 3 
x[0][1][0] = 4
x[0][1][1] = 5
x[0][1][2] = 6
x[0][1][3] = 7
x[1][0][0] = 8
x[1][0][1] = 9
x[1][0][2] = 10
x[1][0][3] = 11
x[1][1][0] = 12
x[1][1][1] = 13
x[1][1][2] = 14
x[1][1][3] = 15

执行以下代码:

A.transpose((1,0,2))  #将 0轴 和 1轴 交换

这里解释一下函数里的参数的意思:
因为我们这里是三维的,因此就有三个轴,默认对轴的编号为0,1,2.即:从0开始编号。
每个编号就代表了对应的轴。
初识时每个轴的位置如上图我们假设所示。在函数内的参数中,初始时默认(0,1,2)现在参数改为
(1,0,2)
即:把0,1的位置调换了,也就是把0,1轴的位置调换了,结果示意图如下:
Python Numpy.transpose函数可视化解释_第4张图片
因此最终的数组为:

A = array([[[ 0,  1,  2,  3],
            [ 8,  9, 10, 11] ],

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

通过坐标表述的方法以后,可以形象的描述transpose函数的实际工作过程
但是由于超过三维以上以后,很难画出具体的坐标轴,笔者能力有限,恕难表述清楚,下面举一个具体的例子来看:
以下的例子是李飞飞教授的热门课程:cs231n_Computer Vision课后作业代码中的一个列子:
PS:代码系笔者本人所写

x=x.reshape(10000,3,32,32).transpose(0,2,3,1).astype('float')

这个代码是在加载CIFAR-10数据集的函数中的一条语句。其中用到了Transpose函数,下面我解释一下为什么要这么做:
通常在目标检测中,我们读入的数据格式是(32,32,3)即通道数在最后,而CIFAR-10的数据集中我们处理的时候是将RGB通道放在了前面(怪我不早处理……),因此要将数轴调换一下,就用到了Transpose函数
个人纯粹是为了方便后面数据处理的时候使用的。

总结

对于Transpose函数的理解可以从建立坐标轴上理解,但是一定要注意数据读取的过程,否则就会出现混乱。由于个人能力有限,无法找出三维以上的形象化的理解方法。对于实际应用中,可以理解为数据的调换,如cs231n中的语句使用。
以上关于数轴方法理解函数也参照了几篇博客,如下:

数轴方法

你可能感兴趣的:(Python Numpy.transpose函数可视化解释)