Python矩阵转置和压缩

18

如何获取该矩阵的转置...有没有更简单的算法方法来做这个...

第一个问题:

 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],但我如何压缩a[n]个元素

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

36

使用 zip(*a)

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

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


5
如果你使用map(list, zip(*a)),我会给这个答案点赞,因为这样可以回答问题而不使用非标准模块。 - martineau

21

问题的答案:

>>> import numpy as np
>>> first_answer = np.transpose(a)
>>> second_answer = [list(i) for i in zip(*a)]
感谢 afg 的帮助。

第一个问题的解决方案怎么样? - Rajeev
5
@Rajeev,这是两个问题的答案。 zip(*a) 是矩阵转置,也是它自己的逆操作。 - agf
4
如果您确实需要将行转换为列表,可以使用map(list, zip(*a))[list(row) for row in zip(*a)]。通常情况下并不需要这样做。 - agf
不知道为什么这个被踩了,它实际上是对zip的一个非常聪明的洞察。@agf的第一条评论尤其有见地。 - Nolen Royalty
1
另外,@luke14free关于第二个答案,我认为你的意思是[list(i) for i in zip(*a)],因为zip(a)已经生成元组了。编辑:我同意agf的观点,不确定为什么你要涉及numpy,当你不需要它时。将zip(a)转换为列表是一个更加优雅(和正确!)的解决方案。 - Nolen Royalty

4
解决方法是使用 tuple() 函数。
以下是在您的情况下如何实现的示例:
a      = [[1,2,3],[4,5,6],[7,8,9]]
output = tuple(zip(*a))

print(output)

2
请描述一下你的答案。 - Angel F Syrus

3
你可以使用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]])

1
你可以使用 list(zip(*a))
通过使用 *a,你的列表可以包含任意数量的条目。

1
  1. Without zip

     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. Using zip

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

0

尝试替换适当的变量

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接