python中数组的转置_numpy的高纬数组转置方法transpose()

一维数组的转置仍是自己,不区分行向量与列向量: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没有变的原因,知道了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值