一维数组的转置仍是自己,不区分行向量与列向量:numpy.T
二维数组的转置与线代的矩阵转置理解方法相同:numpy.T
高纬数组的转置,需用到numpy的方法:transpose()
高纬数组的转置较难理解,以下是我的理解,特此记录。
1.构造一个高纬数组(2*2*4的3维数组),如下:
#in
import numpy as np
arr = np.arange(16).reshape(2,2,4) #reshape一个2*2*4的三维数组
print(arr)
#out
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
对于上面的这个三维数组,如果我们想要取到8这个数,我们需要按索引[1,0,0]来找,即arr[1,0,0]=8。
2.建立shape和index的概念
(1)shape :返回的是一个tuple(元组),上述attr.shpe 的结果是(2,2,4)
对于上述(2,2,4)的三维矩阵:
第一维包含2个元素,元素是二维数组
第二维包含2个元素,元素是两个一维数组/行向量
第三维包含4个元素,元素是具体的数字(这是我们的焦点)
(2)index:tuple是一个有序列表,我们需要按照索引来访问其中的每个元素。
上述arr的shape是(2,2,4),对于(2,2,4)这个tuple,我们需要按照索引来访问,2、2、4对应的索引分别是0、1、2
注意:不要混淆了arr中每个元素的索引(“1”中的arr[1,0,0]=8)和这里shape的索引,下面会用到。
3.高纬矩阵的转置,transpose()方法
注意:这里的转置不要拿线代的转置来想象,这里的转置就是底层数字位置的变换,变换的规则遵循transpose()方法的规则。
#in
print(arr.transpose((1,0,2)))
#out
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
对比一下运用transpose()前后矩阵的变换
#前
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
#后
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
变化:[ 4 5 6 7]和[ 8 9 10 11]换了位置
变换原理:
arr.transpose((1,0,2)运行前后,矩阵的shape并没有变,仍然是(2,2,4),改变的是index,具体如下:
(2,2,4)的索引本身是(0,1,2),通过transpose()将(0,1,2)改成了(1,0,2),也就是改变了索引的次序,第一个位置和第二个位置的索引值调换顺序,0和1换了位置。从而,就改变了attr这个矩阵中所有数字索引的次序,将每个数字的索引的第一个位置和第二个位置的索引值调换位置。
改变前,8的索引是[1,0,0],执行arr.transpose((1,0,2)之后,8的索引是[0,1,0],也就是转换之后,attr[0,1,0]=8
同理:
4.transpose()之后,矩阵的shape一定不变吗?当然不是!
#in
print(arr.transpose(2,0,1))
#out
[[[ 0 4]
[ 8 12]]
[[ 1 5]
[ 9 13]]
[[ 2 6]
[10 14]]
[[ 3 7]
[11 15]]]
transpose(2,0,1)使得(2,2,4)的矩阵改成了(4,2,2)的矩阵
“3”中的矩阵shape没有变的原因,知道了吧。