zoukankan      html  css  js  c++  java
  • numpy之转置(transpose)和轴对换

    转置(transpose)和轴对换

    转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。

    转置有三种方式,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需要用到一个由轴编号组成的元组,才能进行转置。

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

    主要参考:
    AbstractSky的博客
    Albert Chen
    经管之家

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

    我是这样的理解的,比如说三维的数组,那就对维度进行编号,也就是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) #说明这是一个2*2*3的数组(矩阵),返回的是一个元组,可以对元组进行索引,也就是0,1,2
    
    形状 索引
    2 0
    2 1
    3 2

    所以说,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

    但是,对于为什么转置最后一个索引是不动的,颇为不解。数组或者说矩阵的这块有点太抽象了。虽然我线代成绩不错,但是这玩意不太一样啊。

    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]]])                                 
    
  • 相关阅读:
    hdu 4651 Partition (利用五边形定理求解切割数)
    单点登录SSO的实现原理
    高速排序算法
    2014 百度之星第三题
    TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
    教你用笔记本破解无线路由器password
    人脸识别算法初次了解
    JSP验证码
    GROUP BY,WHERE,HAVING之间的差别和使用方法
    typedef函数指针使用方法
  • 原文地址:https://www.cnblogs.com/sunshinewang/p/6893503.html
Copyright © 2011-2022 走看看