numpy中的transpose()函数和swapaxes()函数

一、transpose()函数

基本思想:

按照轴(可以理解为索引)来处理多维数组的转置

引例:

对于一个(2*2*4)的数组,利用numpy的arange()函数产生:

import numpy as np
arr = np.arange(16).reshape((2,2,4))
arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

此时产生的数组arr中,元素0对应的索引为

arr[(0,0,0)]
0

因为arr是(2*2*4)三维的数组,所以索引(0,1,3)中第一个0选择的是

[[0,1,2,3],
 [4,5,6,7]]

结果是一个(2*4)二维的数组,索引(0,1,3)中第二个1选择的是上述结果中的第二个列表

[4,5,6,7]

结果是一个(1*4)一维的数组,索引(0,1,3)中第三个3选择的是列表中的第四个元素

7

知道了索引的顺序之后,可以来解释transpose()函数的用法了

transpose()

transpose()中参数对应的是arr(a*b*c)轴的下标索引

arr.transpose(1,0,2)
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

transpose(1,0,2)中三个参数代表三个轴,因为Python中默认下标从0开始,所以之前的索引顺序是(0,1,2),而现在将索引顺序变成了(1,0,2),arr原本是(2*2*4)三维的数组,(2*2*4)对应的索引是(0,1,2),将2和2交换,arr仍然是(2*2*4)三维的数组,也就是说,原本元素7在arr中的索引是(0,1,3),现在将索引(0,1,3)的 0 和 1 交换了位置,变成了(1,0,3)。

但是,若是这种情况

arr.transpose(2,0,1)
array([[[ 0,  4],
        [ 8, 12]],

       [[ 1,  5],
        [ 9, 13]],

       [[ 2,  6],
        [10, 14]],

       [[ 3,  7],
        [11, 15]]])

arr的结构就发生了变化,这是因为arr是(2*2*4)三维的数组,transpose(2,1,0)是将(2*2*4)中的第一个2和第三个4交换,再将第一个2与第二个2交换,此时arr变成了(4*2*2)三维的数组了,此时元素7对应的索引从(0,1,3)转换为(3,0,1)。

对于四维甚至更高维的亦是同理

arr4 = np.arange(48).reshape((2,3,2,4))
arr4
array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7]],

        [[ 8,  9, 10, 11],
         [12, 13, 14, 15]],

        [[16, 17, 18, 19],
         [20, 21, 22, 23]]],


       [[[24, 25, 26, 27],
         [28, 29, 30, 31]],

        [[32, 33, 34, 35],
         [36, 37, 38, 39]],

        [[40, 41, 42, 43],
         [44, 45, 46, 47]]]])

arr4是一个(2*3*2*4)四维的数组,对于arr4中元素30来说,其原始索引为

arr4[(1,0,1,2)]
30

 这里因为arr4是一个(2*3*2*4)四维的数组,则transpose函数中参数也为四个,且对应着(2*3*2*4)的索引(0,1,2,3)

arr4.transpose(2,0,1,3)
array([[[[ 0,  1,  2,  3],
         [ 8,  9, 10, 11],
         [16, 17, 18, 19]],

        [[24, 25, 26, 27],
         [32, 33, 34, 35],
         [40, 41, 42, 43]]],


       [[[ 4,  5,  6,  7],
         [12, 13, 14, 15],
         [20, 21, 22, 23]],

        [[28, 29, 30, 31],
         [36, 37, 38, 39],
         [44, 45, 46, 47]]]])

 transpose函数是将(2*3*2*4)的索引从(0,1,2,3)换成了(2,0,1,3),则arr变成了(2*2*3*4)四维数组,按照索引的变换规则,元素30的索引也从(1,0,1,2)变成了(1,1,0,2)。

二、swapaxes()函数

基本思想

将数组的两个轴进行交换

arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

将arr的第一个轴和第二个轴交换

arr.swapaxes(0,1)
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

可以看出,arr原本是(2*2*4)三维数组,将第一个轴和第二个轴交换之后,arr变为(2*2*4)三维数组,虽然形式一样,但是两个2是交换位置了的。arr中原来的元素7的索引为(0,1,3),现在变为(1,0,3),原理与transpose()函数差不多,但是transpose函数中参数个数为轴的个数,而swapaxes函数中参数个数只能是两个。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值