Numpy——transpose函数

用于矩阵维度的转换


transpose函数的使用

  • 用法说明

    1
    nums.transpose(dims)
    • numsnp.ndarray类型的对象
    • dims为表示维度排列的tuple
      • 对于二维矩阵,只有0, 1两个维度,所以只能是(0,1), (1,0)
      • 三维矩阵,有0,1,2三个维度,所以可以是是(0,1,2)的所有全排列,共6个

简单易懂的解释

  • 只改变维度, 每一维度对应的数据不会变, 比如图片的shape为: (28, 28, 3),那么无论怎么变化维度, 变换后的数据中维度大小为3的那个维度都是表示通道, (28,28)总是表示图片的每个通道的数据
  • 原始numpy.ndarray,shape(2,3,4)
    • .transpose((0,1,2)): shape(2,3,4), 不变
    • .transpose((1,0,2)): shape(3,2,4)
    • .transpose((2,1,0)): shape(4,3,2)
  • 测试代码
    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
    48
    49
    50
    51
    52
    53
    54
    import numpy as np

    origin = np.random.random_integers(1, 100, (2,3,4))
    print("-"*20 + "origin")
    print(origin)
    print("-"*20 + "(0,1,2)")
    print(origin.transpose((0,1,2)))
    print("-"*20 + "(1,0,2)")
    print(origin.transpose((1,0,2)))
    print("-"*20 + "(2,1,0)")
    print(origin.transpose((2,1,0)))

    # Output:
    --------------------origin
    [[[50 36 80 53]
    [45 45 94 91]
    [49 29 69 53]]

    [[85 83 61 18]
    [16 89 80 60]
    [99 13 36 40]]]
    --------------------(0,1,2)
    [[[50 36 80 53]
    [45 45 94 91]
    [49 29 69 53]]

    [[85 83 61 18]
    [16 89 80 60]
    [99 13 36 40]]]
    --------------------(1,0,2)
    [[[50 36 80 53]
    [85 83 61 18]]

    [[45 45 94 91]
    [16 89 80 60]]

    [[49 29 69 53]
    [99 13 36 40]]]
    --------------------(2,1,0)
    [[[50 85]
    [45 16]
    [49 99]]

    [[36 83]
    [45 89]
    [29 13]]

    [[80 61]
    [94 80]
    [69 36]]

    [[53 18]
    [91 60]
    [53 40]]]

与reshape的区别

reshape的用法:
1
nums.reshape(shape)
* `nums`为`np.ndarray`类型的对象
* `shape`为表示维度排列的`tuple`
    * `shape`必须与原始`nums.shape`兼容,即每个`shape`元素相乘的结果相等
  • numpy中矩阵的存储开始讲起,numpy存储数据是C++的方式存储为一行的,然后分为不同shape以不同方式进行索引
  • reshape相当于是把原始数据先还原成一行(实际上没操作),然后再转变成指定shape的数据,本质上数据存储没变化,只是shape变了,以后索引方式也就变了
区别
  • reshape修改的只是shape,每个维度的意义变了
  • transpose修改的只是维度,同时shape跟着变化而已,每个维度的顺序变了,但是意义不会变