看Python的Numpy库的时候,被 numpy.transpose 函数用于高维数组搞的一头雾水,不明白原理,通过手动分析和代码验证,发现 transpose 的具体用法。
transpose 作用是改变序列,下面是一些小例子:
在不添加参数的情况下:
import numpy as np
x = np.arange(4).reshape((2,2))
输出结果为:
array([[0, 1],
[2, 3]])
使用 transpose 作用之后:
x.transpose()
输出结果为:
array([[0, 2],
[1, 3]])
在添加参数的情况下:
对于二维的 ndarray
对于二维 ndarray,transpose在不指定参数是默认是矩阵转置。如果指定参数,有如下相应结果:
x.transpose((0,1))
输出结果为:
# x 没有变化
array([[0, 1],
[2, 3]])
没有任何变化。
进行如下转换:
x.transpose((1,0))
输出结果为:
# x 发生了转置
array([[0, 2],
[1, 3]])
这个很好理解,因为:
x[0][0] == 0
x[0][1] == 1
x[1][0] == 2
x[1][1] == 3
# 因为 x.transpose((0,1)) 表示按照原坐标轴改变序列,也就是保持不变
# 而 x.transpose((1,0)) 表示交换 ‘0轴’ 和 ‘1轴’,所以就得到转置的结果
对于三维(更高维的)的 ndarray
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]]])
进行如下转换:
A.transpose((0,1,2)) #保持A不变
输出结果为:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
进行如下转换:
A.transpose((1,0,2)) #将 0轴 和 1轴 交换
输出结果为:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
为什么会出现这样的结果呢,因为:
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((0,1,2)) 表示按照原坐标轴改变序列,也就是保持不变
# 而 A.transpose((1,0,2)) 表示交换 ‘0轴’ 和 ‘1轴’,所以就得到如下的结果。
x[0][0][0] == 0
x[0][0][1] == 1
x[0][0][2] == 2
x[0][0][3] == 3
x[1][0][0] == 4
x[1][0][1] == 5
x[1][0][2] == 6
x[1][0][3] == 7
x[0][1][0] == 8
x[0][1][1] == 9
x[0][1][2] == 10
x[0][1][3] == 11
x[1][1][0] == 12
x[1][1][1] == 13
x[1][1][2] == 14
x[1][1][3] == 15
# 将这些数据按照位置放到数组中,就会得到这种结果
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])