【问题标题】:Matrix Transpose in Python [duplicate]Python中的矩阵转置
【发布时间】:2011-06-23 16:13:32
【问题描述】:

我正在尝试为 python 创建一个矩阵转置函数,但我似乎无法使其工作。 说我有

theArray = [['a','b','c'],['d','e','f'],['g','h','i']]

我希望我的功能能够提出

newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]

换句话说,如果我要将这个二维数组打印为列和行,我希望行变成列,列变成行。

到目前为止我做了这个,但它不起作用

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        for tt in range(len(anArray[t])):
            transposed[t] = [None]*len(anArray)
            transposed[t][tt] = anArray[tt][t]
    print transposed

【问题讨论】:

    标签: python list multidimensional-array


    【解决方案1】:

    Python 2:

    >>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
    >>> zip(*theArray)
    [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
    

    Python 3:

    >>> [*zip(*theArray)]
    [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
    

    【讨论】:

    • 如果要遍历结果,izip from itertools 可以为大型数组节省内存。
    • 如何让它返回子列表的列表?喜欢[['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']] 而不是[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
    • @acollection_: map(list, zip(*theArray)).
    • @AntonyHatchkins Python 3.0 及更高版本不需要。在那里,zip 已经返回了一个迭代器:docs.python.org/3.0/whatsnew/…
    • @xuiqzy 不是我不知道,而是确实如此。
    【解决方案2】:
    >>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
    >>> [list(i) for i in zip(*theArray)]
    [['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]
    

    列表生成器使用列表项而不是元组创建一个新的二维数组。

    【讨论】:

    • 如果你想将结果分配给一个变量(而不是直接迭代它),这就是要走的路——假设你想要列表而不是元组,如上所述。跨度>
    • 另一个选项(正如接受答案中的 cmets 所暗示的那样)是:list(map(list, zip(*theArray)))
    【解决方案3】:

    如果你的行不相等,你也可以使用map:

    >>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
    >>> map(None,*uneven)
    [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
    

    编辑:在 Python 3 中,map 的功能发生了变化,可以使用 itertools.zip_longest 代替:
    来源:What’s New In Python 3.0

    >>> import itertools
    >>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
    >>> list(itertools.zip_longest(*uneven))
    [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]
    

    【讨论】:

      【解决方案4】:

      使用 numpy 更容易:

      >>> arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
      >>> arr
      array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
      >>> arr.T
      array([[1, 4, 7],
             [2, 5, 8],
             [3, 6, 9]])
      >>> theArray = np.array([['a','b','c'],['d','e','f'],['g','h','i']])
      >>> theArray 
      array([['a', 'b', 'c'],
             ['d', 'e', 'f'],
             ['g', 'h', 'i']], 
            dtype='|S1')
      >>> theArray.T
      array([['a', 'd', 'g'],
             ['b', 'e', 'h'],
             ['c', 'f', 'i']], 
            dtype='|S1')
      

      【讨论】:

        【解决方案5】:

        您的原始代码的问题是您在每个元素处初始化了transpose[t],而不是每行一次:

        def matrixTranspose(anArray):
            transposed = [None]*len(anArray[0])
            for t in range(len(anArray)):
                transposed[t] = [None]*len(anArray)
                for tt in range(len(anArray[t])):
                    transposed[t][tt] = anArray[tt][t]
            print transposed
        

        这是可行的,尽管有更多 Pythonic 方法可以完成相同的事情,包括 @J.F. 的 zip 应用程序。

        【讨论】:

        • 请注意,此实现不适用于具有不同列数和行数的矩阵
        【解决方案6】:

        要完成 J.F. Sebastian 的回答,如果您有不同长度的列表,请查看 this great post from ActiveState。简而言之:

        内置函数 zip 做了类似的工作,但会截断结果 到最短列表的长度,所以一些元素来自原始 之后数据可能会丢失。

        要处理不同长度的列表,请使用:

        def transposed(lists):
           if not lists: return []
           return map(lambda *row: list(row), *lists)
        
        def transposed2(lists, defval=0):
           if not lists: return []
           return map(lambda *row: [elem or defval for elem in row], *lists)
        

        【讨论】:

        • 这很好。但是,矩阵没有不同长度的列表。
        • 这取决于它们的存储方式。
        【解决方案7】:

        “最佳”答案已经提交,但我想我会补充一点,您可以使用嵌套列表推导,如 Python Tutorial 中所示。

        以下是获得转置数组的方法:

        def matrixTranspose( matrix ):
            if not matrix: return []
            return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]
        

        【讨论】:

          【解决方案8】:

          这个会保留矩形的形状,以便后续的转置得到正确的结果:

          import itertools
          def transpose(list_of_lists):
            return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))
          

          【讨论】:

            【解决方案9】:

            你可以用下面的列表理解来试试这个

            matrix = [['a','b','c'],['d','e','f'],['g','h','i']] n = len(matrix) transpose = [[row[i] for row in matrix] for i in range(n)] print (transpose)

            【讨论】:

              【解决方案10】:

              如果你想转置像 A = np.array([[1,2],[3,4]]) 这样的矩阵,那么你可以简单地使用 AT,但是对于像 a = [1,2 这样的向量],aT 不返回转置!并且你需要使用a.reshape(-1, 1),如下

              import numpy as np
              a = np.array([1,2])
              print('a.T not transposing Python!\n','a = ',a,'\n','a.T = ', a.T)
              print('Transpose of vector a is: \n',a.reshape(-1, 1))
              
              A = np.array([[1,2],[3,4]])
              print('Transpose of matrix A is: \n',A.T)
              

              【讨论】:

                【解决方案11】:

                你可以简单地使用 python 理解来做到这一点。

                arr = [
                    ['a', 'b', 'c'], 
                    ['d', 'e', 'f'], 
                    ['g', 'h', 'i']
                ]
                transpose = [[arr[y][x] for y in range(len(arr))] for x in range(len(arr[0]))]
                

                【讨论】:

                • 虽然这可能是一个正确的答案。如果没有解释它解决原始问题的内容和方式,两行代码并不是很有用。请详细说明您的答案。
                • 对旧问题发布新答案时,期望值很高。请不要发布比已经发布的解决方案低劣的解决方案
                【解决方案12】:
                def matrixTranspose(anArray):
                  transposed = [None]*len(anArray[0])
                
                  for i in range(len(transposed)):
                    transposed[i] = [None]*len(transposed)
                
                  for t in range(len(anArray)):
                    for tt in range(len(anArray[t])):            
                        transposed[t][tt] = anArray[tt][t]
                  return transposed
                
                theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
                
                print matrixTranspose(theArray)
                

                【讨论】:

                  【解决方案13】:
                  import  numpy as np #Import Numpy 
                  
                  m=int(input("Enter row")) #Input Number of row
                  
                  n=int(input("Enter column")) #Input number of column
                  
                  a=[] #Blank Matrix
                  
                  for i in range(m): #Row Input
                  
                      b=[] #Blank List
                  
                      for j in range(n):#column Input
                  
                          j=int(input("Enter Number in Pocket ["+str(i)+"]["+str(j)+"]")) #sow Row Column Number 
                  
                          b.append(j) #addVlaue to list
                  
                      a.append(b)#Add List To Matrix
                  
                  a=np.array(a)#convert 1matrix as Numpy
                  
                  b=a.transpose()#transpose Using Numpy
                  
                  print(a) #Print Matrix 
                  
                  print(b)#print Transpose Matrix
                  

                  【讨论】:

                    【解决方案14】:
                    #generate matrix
                    matrix=[]
                    m=input('enter number of rows, m = ')
                    n=input('enter number of columns, n = ')
                    for i in range(m):
                        matrix.append([])
                        for j in range(n):
                            elem=input('enter element: ')
                            matrix[i].append(elem)
                    
                    #print matrix
                    for i in range(m):
                        for j in range(n):
                            print matrix[i][j],
                        print '\n'
                    
                    #generate transpose
                    transpose=[]
                    for j in range(n):
                        transpose.append([])
                        for i in range (m):
                            ent=matrix[i][j]
                            transpose[j].append(ent)
                    
                    #print transpose
                    for i in range (n):
                        for j in range (m):
                            print transpose[i][j],
                        print '\n'
                    

                    【讨论】:

                      【解决方案15】:
                      a=[]
                      def showmatrix (a,m,n):
                          for i in range (m):
                              for j in range (n):
                                  k=int(input("enter the number")
                                  a.append(k)      
                      print (a[i][j]),
                      
                      print('\t')
                      
                      
                      def showtranspose(a,m,n):
                          for j in range(n):
                              for i in range(m):
                                  print(a[i][j]),
                              print('\t')
                      
                      a=((89,45,50),(130,120,40),(69,79,57),(78,4,8))
                      print("given matrix of order 4x3 is :")
                      showmatrix(a,4,3)
                      
                      
                      print("Transpose matrix is:")
                      showtranspose(a,4,3)
                      

                      【讨论】:

                        【解决方案16】:
                        def transpose(matrix):
                           x=0
                           trans=[]
                           b=len(matrix[0])
                           while b!=0:
                               trans.append([])
                               b-=1
                           for list in matrix:
                               for element in list:
                                  trans[x].append(element)
                                  x+=1
                               x=0
                           return trans
                        

                        【讨论】:

                          【解决方案17】:
                          def transpose(matrix):
                              listOfLists = []
                              for row in range(len(matrix[0])):
                                  colList = []
                                  for col in range(len(matrix)):
                                      colList.append(matrix[col][row])
                              listOfLists.append(colList)
                          
                              return listOfLists
                          

                          【讨论】:

                          • 它是转置的简单实现,尽管也有其他答案中提到的库。
                          【解决方案18】:

                          `

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

                          `此函数将返回转置

                          【讨论】:

                            【解决方案19】:

                            转置矩阵的Python程序:

                            row,col = map(int,input().split())
                            matrix = list()
                            
                            for i in range(row):
                                r = list(map(int,input().split()))
                                matrix.append(r)
                            
                            trans = [[0 for y in range(row)]for x in range(col)]
                            
                            for i in range(len(matrix[0])):
                                for j in range(len(matrix)):
                                    trans[i][j] = matrix[j][i]     
                            
                            for i in range(len(trans)):
                                for j in range(len(trans[0])):
                                    print(trans[i][j],end=' ')
                                print(' ')
                            

                            【讨论】:

                            • 这没用!
                            猜你喜欢
                            • 1970-01-01
                            • 2023-01-06
                            • 1970-01-01
                            • 1970-01-01
                            • 2013-06-06
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多