一、transpose()函数
基本思想:
按照轴(可以理解为索引)来处理多维数组的转置
引例:
对于一个(2*2*4)的数组,利用numpy的arange()函数产生:
import numpy as np
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
此时产生的数组arr中,元素0对应的索引为
arr[(0,0,0)]
0
因为arr是(2*2*4)三维的数组,所以索引(0,1,3)中第一个0选择的是
[[0,1,2,3],
[4,5,6,7]]
结果是一个(2*4)二维的数组,索引(0,1,3)中第二个1选择的是上述结果中的第二个列表
[4,5,6,7]
结果是一个(1*4)一维的数组,索引(0,1,3)中第三个3选择的是列表中的第四个元素
7
知道了索引的顺序之后,可以来解释transpose()函数的用法了
transpose()
transpose()中参数对应的是arr(a*b*c)轴的下标索引
arr.transpose(1,0,2)
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
transpose(1,0,2)中三个参数代表三个轴,因为Python中默认下标从0开始,所以之前的索引顺序是(0,1,2),而现在将索引顺序变成了(1,0,2),arr原本是(2*2*4)三维的数组,(2*2*4)对应的索引是(0,1,2),将2和2交换,arr仍然是(2*2*4)三维的数组,也就是说,原本元素7在arr中的索引是(0,1,3),现在将索引(0,1,3)的 0 和 1 交换了位置,变成了(1,0,3)。
但是,若是这种情况
arr.transpose(2,0,1)
array([[[ 0, 4],
[ 8, 12]],
[[ 1, 5],
[ 9, 13]],
[[ 2, 6],
[10, 14]],
[[ 3, 7],
[11, 15]]])
arr的结构就发生了变化,这是因为arr是(2*2*4)三维的数组,transpose(2,1,0)是将(2*2*4)中的第一个2和第三个4交换,再将第一个2与第二个2交换,此时arr变成了(4*2*2)三维的数组了,此时元素7对应的索引从(0,1,3)转换为(3,0,1)。
对于四维甚至更高维的亦是同理
arr4 = np.arange(48).reshape((2,3,2,4))
arr4
array([[[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]],
[[16, 17, 18, 19],
[20, 21, 22, 23]]],
[[[24, 25, 26, 27],
[28, 29, 30, 31]],
[[32, 33, 34, 35],
[36, 37, 38, 39]],
[[40, 41, 42, 43],
[44, 45, 46, 47]]]])
arr4是一个(2*3*2*4)四维的数组,对于arr4中元素30来说,其原始索引为
arr4[(1,0,1,2)]
30
这里因为arr4是一个(2*3*2*4)四维的数组,则transpose函数中参数也为四个,且对应着(2*3*2*4)的索引(0,1,2,3)
arr4.transpose(2,0,1,3)
array([[[[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19]],
[[24, 25, 26, 27],
[32, 33, 34, 35],
[40, 41, 42, 43]]],
[[[ 4, 5, 6, 7],
[12, 13, 14, 15],
[20, 21, 22, 23]],
[[28, 29, 30, 31],
[36, 37, 38, 39],
[44, 45, 46, 47]]]])
transpose函数是将(2*3*2*4)的索引从(0,1,2,3)换成了(2,0,1,3),则arr变成了(2*2*3*4)四维数组,按照索引的变换规则,元素30的索引也从(1,0,1,2)变成了(1,1,0,2)。
二、swapaxes()函数
基本思想
将数组的两个轴进行交换
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
将arr的第一个轴和第二个轴交换
arr.swapaxes(0,1)
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
可以看出,arr原本是(2*2*4)三维数组,将第一个轴和第二个轴交换之后,arr变为(2*2*4)三维数组,虽然形式一样,但是两个2是交换位置了的。arr中原来的元素7的索引为(0,1,3),现在变为(1,0,3),原理与transpose()函数差不多,但是transpose函数中参数个数为轴的个数,而swapaxes函数中参数个数只能是两个。