对于一维数组:
>>> import numpy as np
>>> t=np.arange(4) # 插入值0-3
>>> t
array([0, 1, 2, 3])
>>> t.transpose()
array([0, 1, 2, 3])
>>>
由上可见,对于一维数组而言,numpy.transpose()是不起作用的。
对于二位数组:
>>> two=np.arange(16).reshape(4,4) # 插入0-15,形状为4*4
>>> two
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> two.transpose()
array([[ 0, 4, 8, 12],
[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15]])
>>> two.transpose(1,0)
array([[ 0, 4, 8, 12],
[ 1, 5, 9, 13],
[ 2, 6, 10, 14],
[ 3, 7, 11, 15]])
有以上可见,原数组two的数组两个轴axis为(x,y),对应的下标为(0,1),np.transpose()传入的参数为(1,0),即将原数组的0,1轴互换。综上,对二维数组的transpose操作就是对原数组的转置操作。
对于三维数组:
>>> three=np.arange(18).reshape(2,3,3)
>>> three
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]]])
>>> three.transpose()
array([[[ 0, 9],
[ 3, 12],
[ 6, 15]],
[[ 1, 10],
[ 4, 13],
[ 7, 16]],
[[ 2, 11],
[ 5, 14],
[ 8, 17]]])
>>>
这是numpy.transpose()函数对three数组默认的操作
二维以上的维数组进行transpose的话,不传参则默认将维度反序
即将原数组的各个axis进行reverse一下,three原始axis排列为(0,1,2),那numpy.transpose()默认的参数为(2,1,0)得到转置后的数组的视图,不影响原数组的内容以及大小。
我们一步一步来分析这个过程:axis(0,1,2)———>axis(2,1,0) ,transpose后的数组相对于原数组来说,相当于交换了原数组的0轴和2轴。ndarray.shape (2,3,3) ->(3,3,2)
(2, 1, 0) 分别代表 维度d, 行l, 列c
#对原始three数组的位置索引下标写出来,如下:
A=[
[ [ (0,0,0) , (0,0,1) , (0,0,2)],
[ (0,1,0) , (0,1,1) , (0,1,2)],
[ (0,2,0) , (0,2,1) , (0,2,2)]],
[[ (1,0,0) , (1,0,1) , (1,0,2)],
[ (1,1,0) , (1,1,1) , (1,1,2)],
[ (1,2,0) , (1,2,1) , (1,2,2)]]
]
#接着把上述每个三元组的第一个数和第三个数进行交换,得到以下的数组
B=[[[ (0,0,0) , (1,0,0) , (2,0,0)],
[ (0,1,0) , (1,1,0) , (2,1,0)],
[ (0,2,0) , (1,2,0) , (2,2,0)]],
[[ (0,0,1) , (1,0,1) , (2,0,1)],
[ (0,1,1) , (1,1,1) , (2,1,1)],
[ (0,2,1) , (1,2,1) , (2,2,1)]]]
#最后在原数组中把B对应的下标的元素,写到相应的位置,如(0,2,1)代表放置到d = 0,行 = 2,列 = 1
#对比看一下,这是原数组
[[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]]]
# 按照B的映射关系得到最终的数组。
C=[[[ 0, 9],
[ 3, 12],
[ 6, 15]],
[[ 1, 10],
[4, 13],
[7, 16]]
[[ 2, 11],
[5, 14],
[8, 17]]
]
# 最终的结果也就是数组C
再看自己定义的转置格式:
arr = np.arange(24).reshape(3, 4, 2)
print(arr)
tran_arr = np.transpose(arr, (1, 0, 2)) # axis索引(0,1,2)变为(1,0,2)
print(tran_arr)
因为索引号由(0,1,2)变成了(1,0,2),axis第一个和第二个交换,shape 由(3,4,2)变成了(4,3,2),可知结果矩阵为d = 4,行3,列2。等效于
arr = np.arange(24).reshape(3, 4, 2)
np.swapaxes(arr,0,1) #交换axis 0,1
再展开矩阵的位置下标,每个元素交换第一个和第二个,得到最终的位置下标。
输出结果:
[[[ 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]
[ 8 9]
[16 17]]
[[ 2 3]
[10 11]
[18 19]]
[[ 4 5]
[12 13]
[20 21]]
[[ 6 7 ]
[14 15]
[22 23]]]
一般用reshape()进行维度转换比较多,直接传入新的维度就行,而不是用下标代替
arr = arr.reshape(4,3,2)
但是实际上二者是有很大区别的,transpose()会将数组进行转置,而reshape()则是按照数组原有的排布顺序,重新按照新维度生成一个依然有序的数组,从以上两图也能看出来
ref:
https://blog.csdn.net/xiongchengluo1129/article/details/79017142
https://blog.csdn.net/jeffery0207/article/details/79411334