python numpy: transpose方法、T属性以及swapaxes方法。

转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。
转置有三种方式,transpose方法、T属性以及swapaxes方法。

1 . T 适用于一、二维数组

In [1]: import numpy as np

In [2]: arr = np.arange(20).reshape(4,5)#生成一个4行5列的数组

In [3]: arr

Out[3]:

array([[ 0, 1, 2, 3, 4],
          [ 5, 6, 7, 8, 9],
          [10, 11, 12, 13, 14],
          [15, 16, 17, 18, 19]])

In [4]: arr.T #求转置

Out[4]:

array([[ 0, 5, 10, 15],
          [ 1, 6, 11, 16],
          [ 2, 7, 12, 17],
          [ 3, 8, 13, 18],
          [ 4, 9, 14, 19]])

2. 高维数组

对于高维数组,transpose需要用到一个由轴编号组成的元组,才能进行转置。

这里,着实好好理解了一下。开始的时候怎么都想不明白。因为他跟矩阵转置理解起来不太一样。

组来说,确定最底层的一个基本元素位置需要用到的索引个数即是维度。这句话的理解可以结合我索引和切片的那篇文章理解。

我是这样的理解的,比如说三维的数组,那就对维度进行编号,也就是0,1,2。这样说可能比较抽象。这里的0,1,2可以理解为对shape返回元组的索引。

比如:

In [59]: arr1 = np.arange(12).reshape(2,2,3)

In [60]: arr1

Out[60]:

array([[[ 0, 1, 2],
          [ 3, 4, 5]],
          [[ 6, 7, 8],
          [ 9, 10, 11]]])

In [61]: arr1.shape #看形状

Out[61]: (2, 2, 3) #说明这是一个223的数组(矩阵),返回的是一个元组,可以对元组进行索引,也就是0,1,2

形状索引
21
22
33

所以说,transpose参数的真正意义在于这个shape元组的索引。

那么它的转置就应该是

In [62]: arr1.transpose((1,0,2))

Out[62]:

array([[[ 0, 1, 2],
   [ 6, 7, 8]],
   [[ 3, 4, 5],
   [ 9, 10, 11]]])

比如,数值6开始的索引是[1,0,0],变换后变成了[0,1,0]。

这也说明了,transpose依赖于shape。shape[0],shape[1],shape[2]原来分别表示矩阵3个维度的索引。
tranpose之后根据transpoe的位置参数,索引的对应关系也发生变化,transpose(1,0,2)就表示原来的shape[0]和shape[1]对调,shape[2]不变。比如你举的例子里面原来6的索引为(1,0,0),transpose之后1和0对调,变成了(0,1,0),其他元素的位置也类似改变。

3.swapaxes

虽然还有点不解的地方,但是,理解了上方那部分之后,swapaxes方法也就很好理解了。它接受一对轴编号。进行轴对换。其实也就是shape参数。

In [67]: arr2 = np.arange(16).reshape(2,2,4)

In [68]: arr2

Out[68]:

array([[[ 0, 1, 2, 3],
   [ 4, 5, 6, 7]],
   [[ 8, 9, 10, 11],
   [12, 13, 14, 15]]])

In [69]: arr2.shape

Out[69]: (2, 2, 4)

In [70]: arr2.swapaxes(1,2)

Out[70]:

array([[[ 0, 4],
   [ 1, 5],
   [ 2, 6],
   [ 3, 7]],
   [[ 8, 12],
   [ 9, 13],
   [10, 14],
   [11, 15]]])

In [4]: arr2.swapaxes(1,0)#转置,对比transpose(1,0,2)

Out[4]:

array([[[ 0, 1, 2, 3],
   [ 8, 9, 10, 11]],
   [[ 4, 5, 6, 7],
   [12, 13, 14, 15]]])

reference:https://www.cnblogs.com/sunshinewang/p/6893503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值