【问题标题】:python matrix transpose and zippython矩阵转置和压缩
【发布时间】:2012-04-16 07:03:54
【问题描述】:

如何得到这个矩阵的转置......任何更简单的算法方法......

第一个问题:

 Input  a=[[1,2,3],[4,5,6],[7,8,9]]
 Expected output a=[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

第二个问题:

Zip 给了我下面的输出,当我不知道数组中有多少元素时,我如何压缩,在这种情况下,我知道 3 个元素 a[0]、a[1]、a[2]但是我怎样才能压缩一个 [n] 个元素

 >>> zip(a[0],a[1],a[2])
 [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

【问题讨论】:

    标签: python


    【解决方案1】:

    问题答案:

    >>> import numpy as np
    >>> first_answer = np.transpose(a)
    >>> second_answer = [list(i) for i in zip(*a)]
    

    感谢 afg 的帮助

    【讨论】:

    • 第一个问题的解决方法呢
    • @Rajeev 这是两个问题的答案。 zip(*a) 是矩阵转置,它自己的逆矩阵也是。
    • @Rajeev 所以你 map(list, zip(*a))[list(row) for row in zip(*a)] 如果你真的需要这些行是列表。通常你不会。
    • 不知道为什么这被否决了,这实际上是对 zip 的一个非常聪明的洞察。 @agf 的第一条评论特别有见地。
    • 另外@luke14free 对于第二个答案我想你的意思是[list(i) for i in zip(*a)] 因为 zip(*a) 已经产生了元组。编辑:我同意 agf,不知道为什么当你不需要时你会在这里参与 numpy。 zip(*a) 与强制列表是一个更优雅(和正确!)的解决方案。
    【解决方案2】:

    使用zip(*a):

    >>> zip(*a)
    [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    

    工作原理:zip(*a) 等于 zip(a[0], a[1], a[2])。

    【讨论】:

    • 如果你有map(list, zip(*a)),我会赞成这个,因为这样可以在不使用非标准模块的情况下回答这个问题。
    【解决方案3】:

    解决方法是使用tuple()函数。

    这是一个如何在您的情况下执行此操作的示例:

    a      = [[1,2,3],[4,5,6],[7,8,9]]
    output = tuple(zip(*a))
    
    print(output)
    

    【讨论】:

    • 请描述一下您的回答。
    【解决方案4】:

    您可以使用list(zip(*a))

    通过使用*a,您的列表可以包含任意数量的条目。

    【讨论】:

      【解决方案5】:

      你可以使用 numpy.transpose

      numpy.transpose

      >>> import numpy
      >>> a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
      >>> numpy.transpose(a)
      array([[1, 4, 7],
             [2, 5, 8],
             [3, 6, 9]])
      

      【讨论】:

        【解决方案6】:

        试试这个替换合适的变量

        import numpy as np
        
        data = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))
        
        data_transpose = np.transpose(data) # replace with your code
        print(data_transpose)
        

        【讨论】:

          【解决方案7】:
          1. 没有拉链

             def transpose(A):
                res = []
            
                for col in range(len(A[0])):
                    tmp = []
                    for row in range(len(A)):
                        tmp.append(A[row][col])
            
                    res.append(tmp)
            
                return res
            
          2. 使用压缩包

            def transpose(A):
                return map(list, zip(*A))
            

          【讨论】:

            猜你喜欢
            • 2011-08-08
            • 1970-01-01
            • 2011-10-02
            • 2014-10-09
            • 1970-01-01
            • 2020-07-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多