zoukankan      html  css  js  c++  java
  • 【Python】无须numpy,利用map函数与zip(*)函数对数组转置(转)

    http://blog.csdn.net/yongh701/article/details/50283689

    在Python的numpy中,对类似array=[[1,2,3],[4,5,6],[7,8,9]];的二维数组的转置,就一句话array.T。其实不使用numpy,单纯使用Python,代码也不长,同样也是一行。不过在此之前,先说明Python中map函数与zip(*)的使用。

    一、map函数

    首先Python中的map函数是很简单的。意为将第二个参数(一般是数组)中的每一个项,处理为第一个参数的类型。比如如下的代码,将a这个list的每一项都从int类型转化为str类型。

    [python] view plain copy
     
    print?
    1. #-*-coding:utf-8-*-  
    2. a=[1,2,3];  
    3. print map(str,a);  
    #-*-coding:utf-8-*-
    a=[1,2,3];
    print map(str,a);


    运行结果如下:

    而如下的数组,则对a这个二维数组中的每一个项的一维数组进行求和操作,最后得出来自然是一个一维数组,因为每一个项的一维数组,转化为一个int。

    [python] view plain copy
     
    print?
    1. #-*-coding:utf-8-*-  
    2. a=[[1,3,4],[2,3,2]];  
    3. print map(sum,a);  
    #-*-coding:utf-8-*-
    a=[[1,3,4],[2,3,2]];
    print map(sum,a);


    运行结果如下:

    二、zip(*)

    在《【Python】用zip函数求欧氏距离、余弦相似度》(点击打开链接)中已经介绍了zip的使用,

    比如下述的一段代码:

    [python] view plain copy
     
    print?
    1. #-*-coding:utf-8-*-  
    2. x=[1,2,3];  
    3. y=[4,5,6];  
    4. z=[7,8,9];  
    5. print zip(x,y,z);  
    #-*-coding:utf-8-*-
    x=[1,2,3];
    y=[4,5,6];
    z=[7,8,9];
    print zip(x,y,z);


    运行结果如下:

    意思是取各个list的第x项,作为返回的二维数组的第x项中的一维数组中的元素。

    其实zip还是反过来会这个二维数组操作,但要注意写成zip(*),表示这是一个zip的逆操作。

    比如下述的一段代码:

    [python] view plain copy
     
    print?
    1. # -*-coding:utf-8-*-  
    2. array=[[1,4,7],[2,5,8],[3,6,9]];  
    3. x,y,z=zip(*array);  
    4. print x,y,z;  
    # -*-coding:utf-8-*-
    array=[[1,4,7],[2,5,8],[3,6,9]];
    x,y,z=zip(*array);
    print x,y,z;


    xyz的值分别如下所示,恰好与zip函数形成一个逆操作。

    三、python中二维数组的转置

    这与数组转置有什么相关呢?

    注意到,如果zip(*array)不经过x,y,z=zip(*array);拆分成x,y,z三个变量,那么[[1,4,7],[2,5,8],[3,6,9]];被zip(*array)之后的结果恰好是[(1, 2, 3), (4, 5, 6), (7, 8, 9)],刚好形成一个转置的关系。这对于所有array=[[1,2,3],[4,5,6],[7,8,9]];的二维数组都是一样的,不信可以试试。

    当然[(1, 2, 3), (4, 5, 6), (7, 8, 9)]还不是我们需要的最后的结果,

    因为只是一个存放tuple的list,我们要保持原来list是存list的一致性,所以要应用到上方的map函数。

    因此对于一个数组的转置,代码如下:

    [python] view plain copy
     
    print?
    1. # -*-coding:utf-8-*-  
    2. array = [[1, 4], [2, 5], [3, 6]];  
    3. print map(list, zip(*array));  
    # -*-coding:utf-8-*-
    array = [[1, 4], [2, 5], [3, 6]];
    print map(list, zip(*array));
    


    运行结果如下:

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/quietwalk/p/7997705.html
Copyright © 2011-2022 走看看