转置此矩阵(python3)

时间:2014-05-04 21:33:43

标签: python python-3.x matrix transpose

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

[[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')

2 个答案:

答案 0 :(得分:2)

您实际上并未分配操作的结果,因此返回原始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来插入虚拟fillvalue s(默认情况下为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

答案 1 :(得分:1)

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

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]]