2013-06-11 24 views
17

Sto provando a creare una funzione di trasposizione di matrici in Python. Una matrice è una matrice bidimensionale, rappresentata come una lista di liste di numeri interi. Ad esempio, la seguente è una matrice 2X3 (cioè l'altezza della matrice è 2 e la larghezza è 3):Transpose a matrix in Python

A=[[1, 2, 3], 
    [4, 5, 6]] 

essere recepita la voce jth nell'indice esimo dovrebbe diventare l'elemento i-esimo del jth index. Ecco come appare il campione sopra riportato:

>>> transpose([[1, 2, 3], 
       [4, 5, 6]]) 
[[1, 4], 
[2, 5], 
[3, 6]] 
>>> transpose([[1, 2], 
       [3, 4]]) 
[[1, 3], 
[2, 4]] 

Come posso fare questo?

+0

È possibile trovare una risposta qui: http://stackoverflow.com/questions/6473679/python-list-of-lists-transpose-without-zipm-thing/38815389#38815389 – 1man

risposta

78

È possibile utilizzare zip con * per ottenere la trasposizione di una matrice:

>>> A = [[ 1, 2, 3],[ 4, 5, 6]] 
>>> zip(*A) 
[(1, 4), (2, 5), (3, 6)] 
>>> lis = [[1,2,3], 
... [4,5,6], 
... [7,8,9]] 
>>> zip(*lis) 
[(1, 4, 7), (2, 5, 8), (3, 6, 9)] 

Se si desidera che l'elenco restituito sia un elenco di elenchi:

>>> [list(x) for x in zip(*lis)] 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
#or 
>>> map(list, zip(*lis)) 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
7

Volendo restituire la stessa matrice avremmo scrivere:

return [[ m[row][col] for col in range(0,width) ] for row in range(0,height) ] 

Quello che fa è che itera su una matrice m passando attraverso ogni riga e ritornare ogni elemento in ciascuna colonna. Così l'ordine sarebbe come:

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

Ora per la domanda 3, che invece vogliono andare colonna per colonna, tornando ogni elemento in ogni riga. Così l'ordine sarebbe come:

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

Pertanto basta passare l'ordine in cui iteriamo:

return [[ m[row][col] for row in range(0,height) ] for col in range(0,width) ] 
16

Esiste un premio per essere pigri e utilizzare la funzione di trasposizione degli array NumPy? ;)

import numpy as np 

a = np.array([(1,2,3), (4,5,6)]) 

b = a.transpose() 
+1

la vostra risposta è non corretto a causa della funzione scheletro data. Questa risposta deve essere fatta usando la comprensione delle liste. La risposta qui sotto è corretta. Buone informazioni però. –

+0

Non solo stai importando un'enorme libreria per fare qualcosa che può essere realizzato con una linea di puro python, la tua risposta è anche tecnicamente sbagliata perché l'output non è un elenco di liste come mostrato nella domanda, ma una matrice numpy. Quindi la risposta è più lunga e più lenta, perché devi convertire in un array numpy, trasporre e riconvertire. –