【问题标题】:Transpose this matrix(python3) [duplicate]转置这个矩阵(python3)[重复]
【发布时间】:2014-06-21 03:03:27
【问题描述】:

我正在尝试找到一种转置矩阵的方法,例如:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

它会将矩阵更改为:

[[1, 4, 7],
 [2, 5, 8],
 [3, 6, 9]]

到目前为止,我尝试了几件事,但都没有成功。我试过了:

def transpose_matrix(matrix): # this one doesn't change the matrix at all
    zip(*matrix)
    return matrix  

def transpose_matrix(matrix):
   map(list, zip(*matrix))
   return matrix

 def transpose_matrix(matrix): # this one returns an empty list []
    print(list(zip(*matrix)))

我想在不使用numpy等外部库的情况下对其进行编码。

之后,它会将结果返回到此菜单并使用转置矩阵进行下一个选项(未显示):

def menu(matrix):
    print('choose option')
    loop = True
    while loop:
        print('''
        1-display matrix
        7-transpose it
        8-other option
        0-back
        ''')
        choi = input('cchoice:')
        if choi =='1':
            print('\n'.join([' '.join(map(str, row)) for row in matrix]))

        elif choix == '7':
            matrix = transpose_matrix(matrix)

        else:
            print('invalid choice')

【问题讨论】:

    标签: python python-3.x matrix transpose


    【解决方案1】:

    您实际上并没有分配您的操作结果,因此返回原始matrix 不变。例如:

    def transpose_matrix(matrix):
        zip(*matrix) # ignore result of computation
        return matrix # return argument unchanged 
    

    请尝试:

    def transpose_matrix(matrix):
        matrix = list(map(list, zip(*matrix))) # assign result 
        return matrix # return transposed matrix
    

    或者简单地说:

    def transpose_matrix(matrix):
        return list(map(list, zip(*matrix)))
    

    请记住,您也需要在调用函数中分配函数的返回值:

    matrix = transpose_matrix(matrix)
    

    就地修改

    或者,您可以就地和隐式转置return None

    def transpose_matrix(matrix):
        matrix[:] = list(map(list, zip(*matrix)))
    

    这样您在调用函数时不必再分配回matrix

    示例

    函数示例:

    >>> def transpose_matrix(matrix):
        return list(map(list, zip(*matrix)))
    
    >>> transpose_matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    >>> def in_place_transpose(matrix):
        matrix[:] = list(map(list, zip(*matrix)))
    
    
    >>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    >>> in_place_transpose(m)
    >>> m
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    

    zip 行为

    需要注意的是,zip 会将其输出截断为可迭代的最短参数,例如:

    >>> a = [1, 2, 3]
    >>> b = [4, 5, 6]
    >>> c = [7, 8]
    >>> d = [9]
    >>> e = []
    >>> for l in (b, c, d, e):
        print(list(zip(a, l)))
    
    
    [(1, 4), (2, 5), (3, 6)]
    [(1, 7), (2, 8)]
    [(1, 9)]
    []
    

    因此,如果您的 matrix 的任何行是空列表,您的输出将是一个空列表。您可以使用zip_longest from itertools 插入虚拟fillvalues(默认为None):

    >>> from itertools import zip_longest
    >>> list(zip_longest([1, 2, 3], [4, 5]))
    [(1, 4), (2, 5), (3, None)]
    >>> m = [[1, 2, 3], [4, 5, 6], []]
    >>> list(zip_longest(*m, fillvalue=0))
    [(1, 4, 0), (2, 5, 0), (3, 6, 0)]
    

    你可以这样实现:

    def transpose_matrix(matrix):
        return list(map(list, zip_longest(*matrix, fillvalue=0)))
    

    from itertools import zip_longest 在您的脚本顶部。

    【讨论】:

    • 我尝试了所有选项,每次矩阵都保持不变
    • @Program_coder 我添加了更多 - 你需要分配函数的结果或修改matrix就地
    • 我尝试了所有,但没有任何效果!我不明白;它要么返回一个空列表,要么根本不改变矩阵;我使用 print('\n'.join([' '.join(map(str, row)) for row in matrix])) 在我的菜单模块中显示矩阵,并在传入转置后显示相同的矩阵模块
    • @Program_coder 它是itertools 的一部分;你需要from itertools import zip_longest
    • @Program_coder 代码在 cmets 中难以阅读。但是,您似乎实际上仍然没有将计算结果分配回matrix。我放弃了:把import放在你的脚本顶部,把我刚刚添加的函数复制粘贴到问题的末尾。
    【解决方案2】:

    您尝试的解决方案存在一些问题:

    def transpose_matrix(matrix):
        zip(*matrix)
        return matrix
    

    zip(…) 的结果被丢弃,而您返回原始矩阵。写return zip(*matrix)

    def transpose_matrix(matrix):
       map(list, zip(*matrix))
       return matrix
    

    同上,map(…) 的结果被丢弃。请改写return map(list, zip(*matrix))

    def transpose_matrix(matrix):
        print(list(zip(*m)))
    

    参数名为matrix,但您正在处理m。所以要么重命名参数m,要么将压缩后的值改为*matrix


    例子:

    >>> m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    >>> list(zip(*m))
    [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    >>> list(map(list, zip(*m)))
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    

    【讨论】:

    • print(list(zip(*matrix))) 打印一个空列表[],我刚试过
    • map(list, zip(*matrix)) return matrix 保持与之前相同的矩阵
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2014-06-09
    • 2015-06-24
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多