1 问题:
对于矩阵来说,有1维,2维,3维,4维,高维。对于2维以下还好理解,比如2维就是一个面,转置就是行变列,列变行。但是对于3维来说,理解起来就比较困难。
2 二维矩阵转置:
import numpy as np
a=np.random.randint(10,size=(5,4)) #生成5*4的矩阵,矩阵的元素为整数且小于10
print(a)
'''
array([[2, 4, 5, 2],
[4, 3, 6, 6],
[5, 1, 4, 9],
[5, 1, 1, 5],
[1, 2, 5, 7]])
'''
# 对a做转置
b=a.T
print(b)
'''
array([[2, 4, 5, 5, 1],
[4, 3, 1, 1, 2],
[5, 6, 4, 1, 5],
[2, 6, 9, 5, 7]])
'''
3 三维矩阵的转置
第一种情况:直接做转置,a1shape为(2,2,3),转置后变成(3,2,2)。中间维度不变
a1=np.random.randint(10,size=(2,2,3))
print(a1)
'''
array([[[8, 8, 3],
[0, 1, 3]],
[[9, 7, 9],
[8, 3, 6]]])
'''
b1 = a1.T #转置
b2 = np.swapaxes(a1,0,2) #把第1个维度和第3个维度互换
b3 = np.swapaxes(a1,2,0) #把第3个维度和第1个维度互换
b4 = np.transpose(a1) #转置
b5 = np.transpose(a1,[2,1,0]) #这里2,1,0表示下标,表示现在排列顺序是,第3维,第2维,第1维
print(b1)
print(b2)
print(b3)
print(b4)
print(b5)
'''
array([[[8, 9],
[0, 8]],
[[8, 7],
[1, 3]],
[[3, 9],
[3, 6]]])
'''
# b1,b2,b3,b4,b5结果一样。
可以把a1看成2,个2*3矩阵,在坐标轴上是,x,y,z,x为2,y为3,z为2,保持x不变,变成3个2*3的矩阵。
黑色的框是8,红色的框也是8,黄色的框是0,绿色的框是9,为了好记,分布叫做黑8,红8,黄0,绿9。以黑8为例来分析。黑8和绿9是x维度的关系,黑8和黄0是y维的关系,黑8和红8是z维的关系。现在要干的活就是把关系从x,y,z的顺序变成,z,y,x的顺序。很明显黑8和绿9是x的关系现在要变成z的关系。像图上画的一样,交换红8和绿9的顺序。因为z维上有3个数字,就要有3个这样的2*2的矩阵。
第二种情况:前面两个维度做转置,a1的shape为(2,2,3),转置后变成(2,2,3)。最后一个维度不变。
c1 = np.swapaxes(a1,0,1)
c2 = np.swapaxes(a1,1,0)
c3 = np.transpose(a1,[1,0,2])
print(c1)
print(c2)
print(c3)
'''
array([[[8, 8, 3],
[9, 7, 9]],
[[0, 1, 3],
[8, 3, 6]]])
'''
#c1,c2,c3结果一样
保持z维的方式不变,改变前两个维度。就是两个元素的关系本来是x的关系,现在变成y的关系
还是以黑8为例,绿9和黑8是x关系,黄0和黑8是y的关系,现在就相当于把绿9和黄0替换位置。其实可以发现,每个元素都有和自己有关系的元素,只要把相应的位置替换,就可以了。
第三种情况:后面两个维度做转置,a1的shape为(2,2,3),转置后变成(2,3,2)。第一个维度不变。
d1 = np.swapaxes(a1,1,2)
d2 = np.swapaxes(a1,2,1)
d3 = np.transpose(a1,[0,2,1])
print(d1)
print(d2)
print(d3)
'''
[[[8 0]
[8 1]
[3 3]]
[[9 8]
[7 3]
[9 6]]]
'''
#d1,d2,d3结果一样
保持x维的方式不变,改变后两个维度。就是两个元素的关系本来是y的关系,现在变成z的关系。
还是以黑8为例,黄0和黑8是y关系,红8和黑8是z的关系,现在就相当于把红8和黄0替换位置。可以看出,整体的操作相当于上面一个矩阵和下面一个矩阵,分别转置。
总结:矩阵(二维数组)转置,就是把里面的元素拆分成三种关系,一般来说有需要转置两种关系,那么就互换这两者之间的位置,基本上可以知道最后的结果长什么样。