2013-06-11 9 views
17

Próbuję utworzyć funkcję transpozycji macierzy w języku Python. Macierz to dwuwymiarowa tablica, reprezentowana jako lista list całkowitych. Na przykład, po to macierz 2X3 (czyli wysokość matrycy 2 i szerokości 3)Transponuj macierz w Pythonie

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

Do transpozycji elementu j w indeksie i-tego należy się element ego w jth index. Oto jak wygląda powyższa próbka:

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

Jak mogę to zrobić?

+0

można znaleźć odpowiedź tutaj: http://stackoverflow.com/questions/6473679/python-list-of-lists-transpose-without-zipm-thing/38815389#38815389 – 1man

Odpowiedz

78

Można użyć zip z * dostać transpozycję macierzy:

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

Jeśli chcesz, aby zwrócona lista była listą:

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

Gdybyśmy chcieli wrócić tą samą matrycę chcielibyśmy napisać:

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

Co to robi to iteracje nad matrycę M przechodząc przez każdego wiersza i powrocie każdy element w każdej kolumnie. więc kolejność będzie jak:

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

teraz na pytanie 3, zamiast tego chcą przejść przez kolumnę kolumny, wracając każdy element w każdym wierszu. więc kolejność będzie jak:

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

Dlatego właśnie zmienić kolejność, w której iterację:

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

Czy istnieje nagroda za bycie leniwym i korzystanie z funkcji transpozycji macierzy NumPy? ;)

import numpy as np 

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

b = a.transpose() 
+1

Twoja odpowiedź jest nie jest poprawny z powodu podanej funkcji szkieletu. Ta odpowiedź musi być wykonana przy użyciu zrozumienia list. Poniższa odpowiedź jest poprawna. Dobra informacja. –

+0

Nie tylko importujesz ogromną bibliotekę, aby zrobić coś, co można osiągnąć za pomocą jednej linii czystego Pythona, twoja odpowiedź jest również zła technicznie, ponieważ wynik nie jest listą list, jak pokazano w pytaniu, ale tablicą numpy. Tak więc odpowiedź jest dłuższa i wolniejsza, ponieważ musisz przekonwertować na tablicę numpy, przetransponować i przekonwertować z powrotem. –