目录
transpose 的原理其实是根据维度(shape)索引决定的,举个栗子:
转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。
对numpy数组的转置有三种方式,
transpose
方法、T
属性以及swapaxes
方法。
1 .T,适用于一、二维数组
arr.T #求转置
In [1]: import numpy as np
In [2]: arr = np.arange(20).reshape(4,5)#生成一个4行5列的数组
In [3]: arr
Out[3]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]) # 4行5列
In [4]: arr.T #求转置
Out[4]:
array([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]]) # 5行4列
transpose 的原理其实是根据维度(shape)索引决定的,举个栗子:
x = np.arange(4).reshape((2,2)) //生成一个2x2的数组
print(x)
[[0 1]
[2 3]]
我们生成了一个维度为二维的数组,其中有两个索引值(矩阵的行与列)。
transpose()函数的作用就是调换数组的行列值的索引值,类似于求矩阵的转置:
x = np.arange(4).reshape((2,2))
x = np.transpose(x)
print(x)
[[0 2]
[1 3]]
我们可以直观的看到,数组的行列索引值对换,1的位置从x(0,1)跑到了x(1,0)。
那么三维数组呢?
2. 高维数组
对于高维数组,transpose需要用到一个由轴编号组成的元组,才能进行转置。
这里,着实好好理解了一下。开始的时候怎么都想不明白。因为他跟矩阵转置理解起来不太一样。
首先定义一个原数组arr
原3维数组arr:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
3个维度: (2, 3, 4)
原三维数组 arr 三个维度 (2,3,4) CHW,对应的是 (0,1,2) 三个索引
形状 | 索引 |
2 | 0 |
3 | 1 |
4 | 2 |
transpose 函数可以理解为改变数组数值的映射关系,原数组中,6这个数所在的索引是(0,1,2)
arr1 = arr.transpose((1,0,2)) 的操作相当于把原三维数组 arr 的第一个维度和第二个维度调换【新数组6这个数所在的索引是(1,0,2)】
arr2 = arr.transpose((0,2,1)) 的操作相当于把原三维数组 arr 的第二个维度和第三个维度调换【新数组6这个数所在的索引是(0,2,1)】
原数组 arr (2,3,4)
新数组 arr1 (3,2,4)
新数组arr2 (2,4,3)
3. swapaxes
虽然还有点不解的地方,但是,理解了上方那部分之后,swapaxes
方法也就很好理解了。它接受一对轴编号。进行轴对换。其实也就是shape
参数。
In [67]: arr2 = np.arange(16).reshape(2,2,4)
In [68]: arr2
Out[68]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
In [69]: arr2.shape
Out[69]: (2, 2, 4)
In [70]: arr2.swapaxes(1,2)
Out[70]:
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
In [4]: arr2.swapaxes(1,0)#转置,对比transpose(1,0,2)
Out[4]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
文章转载自: