python transpose函数_Numpy之np.transpose矩阵转置

对于一维数组:

>>> 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值