Próbuję utworzyć funkcję transpozycji macierzy dla języka Python, ale nie mogę jej uruchomić. Powiedz, że tak
theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
i chcę, żeby moja funkcja wymyśliła
newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]
Innymi słowy, gdybym miał wydrukować tę tablicę 2D jako kolumny i wiersze, chciałbym, aby wiersze zamieniły się w kolumny, a kolumny w wiersze.
Dotarłem do tej pory, ale to nie działa
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
Julio Diaz
źródło
źródło
izip
zitertools
może zaoszczędzić pamięć dla dużych tablic.[['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']]
zamiast[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
?map(list, zip(*theArray))
.zip
już zwraca iterator: docs.python.org/3.0/whatsnew/…generator list tworzy nową tablicę 2d z elementami listy zamiast krotek.
źródło
list(map(list, zip(*theArray)))
Jeśli twoje wiersze nie są równe, możesz również użyć
map
:Edycja: W Pythonie 3 funkcjonalność
map
zmieniona,itertools.zip_longest
można użyć zamiast:Źródło: Co nowego w Pythonie 3.0
źródło
O wiele łatwiej z Numpy:
źródło
Problem z oryginalnym kodem polegał na tym, że zainicjowałeś
transpose[t]
każdy element, a nie tylko raz na wiersz:To działa, chociaż jest więcej Pythonowych sposobów na osiągnięcie tego samego, w tym
zip
aplikacja @ JF .źródło
Aby uzupełnić odpowiedź JF Sebastiana, jeśli masz listę list o różnych długościach, przeczytaj ten wspaniały post z ActiveState . W skrócie:
Aby obsłużyć listę list o różnych długościach, użyj:
źródło
„Najlepsza” odpowiedź została już przesłana, ale pomyślałem, że dodam, że możesz używać zagnieżdżonych list składanych, jak pokazano w samouczku Pythona .
Oto jak można uzyskać transponowaną tablicę:
źródło
Ten zachowa prostokątny kształt, dzięki czemu kolejne transpozycje dadzą właściwy efekt:
źródło
możesz tego spróbować ze zrozumieniem listy, jak poniżej
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)
źródło
Jeśli chcesz transponować macierz taką jak A = np.array ([[1,2], [3,4]]), możesz po prostu użyć AT, ale dla wektora takiego jak a = [1,2], aT nie zwraca transpozycji! i musisz użyć a.reshape (-1, 1), jak poniżej
źródło
Możesz to zrobić po prostu używając rozumienia w Pythonie.
źródło
źródło
źródło
źródło
źródło
źródło
`
`Ta funkcja zwróci transpozycję
źródło
Program w Pythonie do transpozycji macierzy:
źródło