详解Python中的 transpose() 函数

看Python的Numpy库的时候,被 numpy.transpose 函数用于高维数组搞的一头雾水,不明白原理,通过手动分析和代码验证,发现 transpose 的具体用法。

transpose 作用是改变序列,下面是一些小例子:

在不添加参数的情况下:

import numpy as np
x = np.arange(4).reshape((2,2))

输出结果为:

array([[0, 1],
       [2, 3]])

使用 transpose 作用之后:

x.transpose()

输出结果为:

array([[0, 2],
       [1, 3]])

在添加参数的情况下:

对于二维的 ndarray

对于二维 ndarray,transpose在不指定参数是默认是矩阵转置。如果指定参数,有如下相应结果:

x.transpose((0,1))

输出结果为:

# x 没有变化
array([[0, 1],
       [2, 3]])

没有任何变化。
进行如下转换:

x.transpose((1,0))

输出结果为:

# x 发生了转置
array([[0, 2],
       [1, 3]])

这个很好理解,因为:

x[0][0] == 0
x[0][1] == 1
x[1][0] == 2
x[1][1] == 3

# 因为 x.transpose((0,1)) 表示按照原坐标轴改变序列,也就是保持不变
# 而 x.transpose((1,0)) 表示交换 ‘0轴’ 和 ‘1轴’,所以就得到转置的结果
对于三维(更高维的)的 ndarray
import numpy as np

# A是array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
A = np.arange(16)

# 将A变换为三维矩阵
A = A.reshape(2,2,4)
print(A)

输出结果为:

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

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

进行如下转换:

A.transpose((0,1,2))  #保持A不变

输出结果为:

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

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

进行如下转换:

A.transpose((1,0,2))  #将 0轴 和 1轴 交换

输出结果为:

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

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

为什么会出现这样的结果呢,因为:

x[0][0][0] == 0
x[0][0][1] == 1
x[0][0][2] == 2
x[0][0][3] == 3

x[0][1][0] == 4
x[0][1][1] == 5
x[0][1][2] == 6
x[0][1][3] == 7

x[1][0][0] == 8
x[1][0][1] == 9
x[1][0][2] == 10
x[1][0][3] == 11

x[1][1][0] == 12
x[1][1][1] == 13
x[1][1][2] == 14
x[1][1][3] == 15

# 因为 A.transpose((0,1,2)) 表示按照原坐标轴改变序列,也就是保持不变
# 而 A.transpose((1,0,2)) 表示交换 ‘0轴’ 和 ‘1轴’,所以就得到如下的结果。

x[0][0][0] == 0
x[0][0][1] == 1
x[0][0][2] == 2
x[0][0][3] == 3

x[1][0][0] == 4
x[1][0][1] == 5
x[1][0][2] == 6
x[1][0][3] == 7

x[0][1][0] == 8
x[0][1][1] == 9
x[0][1][2] == 10
x[0][1][3] == 11

x[1][1][0] == 12
x[1][1][1] == 13
x[1][1][2] == 14
x[1][1][3] == 15

# 将这些数据按照位置放到数组中,就会得到这种结果

array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值