Używam Python i NumPy i mam pewne problemy z „transponowaniem”:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Wywołanie a.T
nie transponuje tablicy. Jeśli a
jest na przykład, [[],[]]
to transponuje się poprawnie, ale potrzebuję transpozycji [...,...,...]
.
Odpowiedzi:
Działa dokładnie tak, jak powinien. Transpozycja macierzy 1D jest nadal macierzą 1D ! (Jeśli jesteś przyzwyczajony do Matlaba, zasadniczo nie ma pojęcia tablicy 1D. Tablice Matlaba „1D” są 2D.)
Jeśli chcesz przekształcić wektor 1D w macierz 2D, a następnie transponować go, po prostu pokrój go
np.newaxis
(lubNone
, tak samo,newaxis
jest po prostu bardziej czytelny).Ogólnie rzecz biorąc, nigdy nie musisz się o to martwić. Dodanie dodatkowego wymiaru zwykle nie jest tym, czego chcesz, jeśli robisz to z przyzwyczajenia. Numpy automatycznie wyemituje tablicę 1D podczas wykonywania różnych obliczeń. Tam zazwyczaj nie ma potrzeby rozróżniania pomiędzy wektorem wiersza i kolumny wektor (z których żaden nie są wektory . Są zarówno 2D!), Gdy chcesz po prostu wektor.
źródło
np.arange
aby szybko zrobić tablicę 1D. Działa dokładnie tak samo dlaa = np.array([5,4])
.()
nie wskazują dodatkowego wymiaru w numpy. Jeślia = np.arange(10)
tak,a
toarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
jak wyprodukowała.__repr__()
. Jest toa.ndim --> 1
wektor 1-wymiarowy (tj. ), Jak wskazano w nawiasach kwadratowych[]
.array( ... )
Nie jest widoczne, gdy robisz alboprint(a)
alboa.__str__()
.np.vstack()
operacja się być bardziej wyraźne:print np.vstack(a)
.Użyj dwóch par wsporników zamiast jednej. Tworzy to tablicę 2D, którą można transponować, w przeciwieństwie do tablicy 1D, którą tworzysz, jeśli używasz jednej pary wsporników.
Bardziej dokładny przykład:
Użyj
shape
metody numpy, aby zobaczyć, co się tutaj dzieje:źródło
Dla tablic 1D :
Kiedy zrozumiesz, że -1 oznacza tutaj „tyle wierszy, ile potrzeba”, uważam, że jest to najbardziej czytelny sposób na „transponowanie” tablicy. Jeśli twoja tablica ma wyższą wymiarowość, po prostu użyj
a.T
.źródło
transpose
ireshape
modyfikuj tablicę na różne sposoby (wynikowy kształt obrazu jest taki sam, ale elementy są rozmieszczone inaczej).Możesz przekonwertować istniejący wektor na macierz, zawijając go w dodatkowy zestaw nawiasów kwadratowych ...
numpy ma również
matrix
klasę (patrz tablica vs. macierz ) ...źródło
tablica numpy 1D -> macierz kolumn / wierszy:
I jak @ joe-kington powiedział, można wymienić
None
zenp.newaxis
dla czytelności.źródło
Aby „przetransponować” tablicę 1d do kolumny 2d, możesz użyć
numpy.vstack
:Działa również w przypadku list waniliowych:
źródło
vstack
?np.concatenate([atleast_2d(_m) for _m in tup], 0)
. Dzieli tablicę na tablice (1,1) i łączy je! Podczas tego procesu tworzy kopię, podczas gdy wszystkie przekształcone tworzą widok.Możesz transponować tylko tablicę 2D. Możesz użyć
numpy.matrix
do utworzenia tablicy 2D. Spóźnia się o trzy lata, ale dodajemy tylko do możliwego zestawu rozwiązań:źródło
np.matrix
nie jest potrzebne i ogólnie jest odradzane.zamiast tego użyj
arr[:,None]
do utworzenia wektora kolumnyźródło
Transpozycja
jest
kod jest:
to link, aby uzyskać więcej informacji:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
źródło
Inne rozwiązanie.... :-)
źródło
Właśnie konsoliduję powyższy post, mam nadzieję, że pomoże innym zaoszczędzić trochę czasu:
Poniższa tablica ma
(2, )
wymiar, jest to tablica 1-D,Istnieją dwa sposoby transpozycji tablicy 1-D:
pokroić na „np.newaxis” lub brak.!
inny sposób pisania, powyższe bez
T
operacji.!Zawijanie [] lub użycie np.matrix oznacza dodanie nowego wymiaru.!
źródło
Jak niektóre z wyżej wspomnianych komentarzy, transpozycja tablic 1D to tablice 1D, więc jednym ze sposobów transpozycji tablicy 1D byłoby przekonwertowanie tablicy na macierz w następujący sposób:
źródło
Nazwa funkcji w
numpy
to column_stack .źródło
Jest to metoda nie została opisana w odpowiedzi, ale opisane w dokumentacji dla
numpy.ndarray.transpose
metody:Można zrobić:
Które (imo) jest ładniejsze niż używanie
newaxis
.źródło
Zasadniczo funkcja transpozycji polega na zamianie kształtu i kroków tablicy:
W przypadku tablicy numpy 1D (tablica rangi 1) kształt i kroki są krotkami 1-elementowymi i nie można ich zamienić, a transpozycja takiej tablicy 1D zwraca ją bez zmian. Zamiast tego możesz przetransponować „wektor wiersza” (tablica numeryczna kształtu
(1, n)
) na „wektor kolumnowy” (tablica numeryczna kształtu(n, 1)
). Aby to osiągnąć, musisz najpierw przekonwertować tablicę numpy 1D na wektor wiersza, a następnie zamienić kształt i kroki (przetransponować). Poniżej znajduje się funkcja, która to robi:Przykład:
Oczywiście nie musisz tego robić w ten sposób, ponieważ masz tablicę 1D i możesz bezpośrednio przekształcić ją w
(n, 1)
tablicę za pomocąa.reshape((-1, 1))
luba[:, None]
. Chciałem tylko pokazać, jak działa transpozycja macierzy.źródło
Sposób, w jaki nauczyłem się implementować to w zwarty i czytelny sposób dla tablic 1-D, jak dotąd:
numpy.r_ i numpy.c_ tłumaczą obiekty plasterków na konkatenację odpowiednio wzdłuż pierwszej i drugiej osi. Dlatego krojenie v2 [:, 0] w transponowaniu z powrotem pionowej tablicy v2 do poziomej tablicy h2
numpy.vstack jest równoważne konkatenacji wzdłuż pierwszej osi po przekształceniu tablic kształtu 1-D (N,) w (1, N). Odbudowuje tablice podzielone przez vsplit .
źródło