zoukankan      html  css  js  c++  java
  • Numpy三维数组的转置与交换轴

    二维数组的转置应该都知道,就是行列交换

    而在numpy中也可以对三维数组进行转置,np.T 默认进行的操作是将0轴与2轴交换

    本文主要对三位数组轴交换的理解上发表本人的看法。


    a = np.array(range(24))
    
    Out[101]: 
    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])
    
    b = a.reshape(2,3,4)
    b
    Out[103]: 
    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]]])

    在三位数组中我们称三个轴分别为行,列,面

    在数组b中,

    [[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11]],是一行
    [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]是一行
    展开写[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]看的更清楚。这是行的概念
    [ 0, 1, 2, 3],是一列
    [ 4, 5, 6, 7],是一列
    [ 8, 9, 10, 11]是一列
    而其中[0,4,8] [1,5,9] [2,6,10] [3,7,11]分别是一个面
    回过头来可以发现,b是由2行3列4面组成的三维数组 (行代表0轴,列1轴,面2轴)

    接下来记住一句话,交换哪两个轴,要保持另一个轴不改变,示例如下
    取c为b的列和面交换后的数组
    c = b.swapaxes(1,2)
    
    c
    Out[105]: 
    array([[[ 0,  4,  8],
            [ 1,  5,  9],
            [ 2,  6, 10],
            [ 3,  7, 11]],
    
           [[12, 16, 20],
            [13, 17, 21],
            [14, 18, 22],
            [15, 19, 23]]])

    回想那句话,交换哪两个轴,另一个轴不变,可以发现c还是两行,而且交换只是在每一行中发生变化

    原来的列变成了面,原来的面变成了列

    看第二种,d表示b的0轴和2轴的交换

    d = b.swapaxes(0,2)
    
    d
    Out[108]: 
    array([[[ 0, 12],
            [ 4, 16],
            [ 8, 20]],
    
           [[ 1, 13],
            [ 5, 17],
            [ 9, 21]],
    
           [[ 2, 14],
            [ 6, 18],
            [10, 22]],
    
           [[ 3, 15],
            [ 7, 19],
            [11, 23]]])
    看上去有点蒙逼了,但还是想一下那句话,交换了0轴和2轴,那么1轴是不变的。
    我们把原来的b看成是以行和面为元素的二维数组
    即b是两行,四面。每个面用第一个元素代替 即[0,4,8] 用[0]来代替
    即b可以写成[[0],[1],[2],[3]
          [12],[13],[14],[15]]
    然后进行交换轴 其实也就变成了二维数组的转置
    变换后为[0],[12]
        [1],[13]
        [2],[14]
        [3],[15]
    最后我们再把每个面展开,就得到结果了。到现在你有没有法线,面中的元素个数与列的大小是一样的。
    好了,接下来你可以试试将0轴与1轴交换。一步一步来,欢迎评论区讨论。
          



  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/wildbloom/p/7928237.html
Copyright © 2011-2022 走看看