numpy数组转置
很多时候我们需要对数组进行转置以方便运算处理,在numpy中有3种方法可以对数组进行转置,分别是T、transpose、swapaxes。
数组转置原理
首先上例子:
>>> import numpy as np
>>> data = np.arange(24).reshape(2,3,4)
>>> print(data)
# 转置前初始数据,可以视为2*3*4的一个矩阵
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
# 将维度0和维度1调换,变为3*2*4的矩阵
>>> data.transpose(1,0,2);
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
对于高维数组的转置,其实可以通过index索引来理解,以上面的数据为例说明为什么数据会发生这样的变化。
转置前数组的维度信息是234,此时维度0有2个数据,维度1有3个数据,维度2有4个数据。
转置后,维度0和维度1调换,调换后维度0有3个数据,维度1有2个数据,维度2有4个数据,转置后数组的维度信息应为324
举几个例子(0,5,10,15,18,21)说明数字位置发生的变化:
数字0:转置前的索引是(0,0,0),转置后调换维度,索引为(0,0,0)
数字5:转置前的索引是(0,1,1),转置后调换维度,索引为(1,0,1)
数字10:转置前的索引是(0,2,2),转置后调换维度,索引为(2,0,2)
数字15:转置前的索引是(1,0,3),转置后调换维度,索引为(0,1,3)
数字18:转置前的索引是(1,1,2),转置后调换维度,索引为(1,1,2)
数字21:转置前的索引是(1,2,1),转置后调换维度,索引为(2,1,1)
可以看到上面的数据正是符合这样的变化的。
转置函数介绍
T
对数组进行完全的转置,例如原来是从维度0 ~ 2,转置后是从维度2 ~ 0,原来矩阵是2 * 3 * 4,转置后为4 * 3 * 2.如下所示:
>>> data.T
array([[[ 0, 12],
[ 4, 16],
[ 8, 20]],
[[ 1, 13],
[ 5, 17],
[ 9, 21]],
[[ 2, 14],
[ 6, 18],
[10, 22]],
[[ 3, 15],
[ 7, 19],
[11, 23]]])
transpose
指定变换后的维度,例如从维度(0,1,2)到维度(1,0,2),数组从2 * 3 * 4到3 * 2 * 4,如下所示:
>>> data.transpose(1,0,2);
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])
swapaxes
将指定的两个维度进行调换,例如上面的例子就可以理解为是对维度0和维度1进行了兑换,可以用如下代码实现
>>> data.swapaxes(0,1)
array([[[ 0, 1, 2, 3],
[12, 13, 14, 15]],
[[ 4, 5, 6, 7],
[16, 17, 18, 19]],
[[ 8, 9, 10, 11],
[20, 21, 22, 23]]])