2011-05-10 12 views
104

używam Python i Numpy i mieć pewne problemy z „przeniesienia”:Transpozycja macierzy numpy

a=array([5,4]) 
print a 
print a.T 

Wywoływanie a.T nie transpozycję macierzy. Jeśli a jest na przykład [[],[]], to transponuje poprawnie, ale potrzebuję transpozycji [...,...,...].

+0

próbowałem także "print a.transpose", który jest taki sam, ale bez powodzenia, nie transponuj ... – thaking

Odpowiedz

145

Działa dokładnie tak, jak powinien. Transpozycja macierzy 1D jest nadal tablicą 1D! (Jeśli jesteś przyzwyczajony do Matlab, to zasadniczo nie ma koncepcji tablicy 1D, macierze "1D" Matlab to 2D.)

Jeśli chcesz zamienić swój wektor 1D w tablicę 2D, a następnie transponować to, po prostu pociąć go na np.newaxis (lub None, są takie same, newaxis jest po prostu bardziej czytelny).

import numpy as np 
a = np.array([5,4])[np.newaxis] 
print a 
print a.T 

Ogólnie rzecz biorąc, nie musisz się tym martwić. Dodanie dodatkowego wymiaru zazwyczaj nie jest tym, czego potrzebujesz, jeśli robisz to z przyzwyczajenia. Numpy automatycznie wyemituje tablicę 1D podczas wykonywania różnych obliczeń. Zwykle nie ma potrzeby rozróżniania wektora wiersza od wektora kolumny (z których żaden nie jest wektory. Oba są 2D!), Gdy chcesz tylko wektor.

+0

No tak, ale mam a = [5,4]; not a = [1,2,3,4,5 ...] – thaking

+2

@Thaking - Właśnie użyłem 'np.arange', aby szybko utworzyć tablicę 1D. Działa dokładnie tak samo dla 'a = np.array ([5,4])'. –

+2

@thaking Jeśli jesteś nowy na numpy - pamiętaj, że okrągłe nawiasy '()' nie wskazują dodatkowego wymiaru w numpy. Jeśli 'a = np.arange (10)' to 'a' to' array ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 'as wyprodukowane przez' a .__ repr __ () '. Jest to 1-wymiarowy (tj. 'A.ndim -> 1') wektor wskazany przez nawiasy kwadratowe' [] '. 'Tablica (...)' nie jest widoczna, kiedy wykonujesz 'print (a)' lub 'a .__ str_ _()'. – dtlussier

-4

transpozycję [5,4] na [5,4], ale w rzeczywistości

[5, 
4] 

PS nie jest to prosty sposób transpozycji matrycy 2D -

zip(*a) 
+1

Mogę się mylić, ale czy nie jest to transpozycja [5,4] = [[5], [4]]? –

+0

Jeśli zrobię zip (* a), otrzymałem błąd: TypeError: argument zip # 1 musi obsługiwać iterację – thaking

+0

@taking - zanotuj macierz 2D. To nie zadziała na [5,4]. Będzie działać na coś takiego jak [[5,4], [6,7]] – manojlds

77

wykorzystujących dwa wspornik pary zamiast jednego. Tworzy to tablicę 2D, którą można transponować, w przeciwieństwie do macierzy 1D tworzonej w przypadku użycia pary nawiasów.

import numpy as np  
a = np.array([[5, 4]]) 
a.T 

Dokładniejsza przykład:

>>> a = [3,6,9] 
>>> b = np.array(a) 
>>> b.T 
array([3, 6, 9])   #Here it didn't transpose because 'a' is 1 dimensional 
>>> b = np.array([a]) 
>>> b.T 
array([[3],    #Here it did transpose because a is 2 dimensional 
     [6], 
     [9]]) 

Skorzystaj NumPy za shape sposób, aby zobaczyć co się dzieje tutaj:

>>> b = np.array([10,20,30]) 
>>> b.shape 
(3,) 
>>> b = np.array([[10,20,30]]) 
>>> b.shape 
(1, 3) 
+5

Preferuję to rozwiązanie do [np.newaxis], wygląda bardziej elegancko. – PhilMacKay

14

można przekształcić istniejący wektor do macierzy poprzez owinięcie go w dodatkowy zestaw nawiasów kwadratowych ...

from numpy import * 
v=array([5,4]) ## create a numpy vector 
array([v]).T ## transpose a vector into a matrix 

numpy ma również klasę matrix (zobacz array vs. matrix) ...

matrix(v).T ## transpose a vector into a matrix 
8

numpy 1D matryca -> matrycę kolumny/kolumna:

>>> a=np.array([1,2,4]) 
>>> a[:, None] # col 
array([[1], 
     [2], 
     [4]]) 
>>> a[None, :] # row, or faster `a[None]` 
array([[1, 2, 4]]) 

A @ Joe-kington to, można wymienić None z np.newaxis dla czytelności.

3

Możesz transponować tylko tablicę 2D. Możesz użyć numpy.matrix, aby utworzyć tablicę 2D. To trzy lata późno, ale jestem po prostu dodając do możliwego zestawu rozwiązań:

import numpy as np 
m = np.matrix([2, 3]) 
m.T 
0

W niektórych komentarzach wyżej wymienionych, transpozycją macierzy 1D są 1D tablice, więc jeden sposób transpozycji tablicę 1D byłoby przekształcić tablicę do matrycy tak:

np.transpose(a.reshape(len(a), 1)) 
32

trochę późno na imprezę I zobaczyć, ale oto mój ulubiony trik:

a = np.array([1, 2, 3, 4]) 
a = a.reshape((-1, 1)) # <--- THIS IS THE TRICK 

print a 
array([[1], 
     [2], 
     [3], 
     [4]]) 

Kiedy już uzyskasz, że -1 wewnątrz krotki mówi "tyle rzędów ile potrzeba", uważam to za najbardziej czytelny sposób "transpozycji" tablicy.

+1

Należy zauważyć, że działa to tylko w przypadku wektorów. Jeśli masz tablicę 2-wymiarową, operacje 'transpose' i' reshape' zmieniają tablicę na różne sposoby (wynikowy kształt obrazu jest taki sam, ale elementy są umieszczane inaczej). – johndodo

+0

Dzięki za uwagę. Rozumiem twój punkt widzenia, ale myślę, że to rozprasza więcej niż oczyszcza moją odpowiedź, ponieważ podaję prostą, jednoliniową odpowiedź na dokładne pytanie, które @stakie ramki. Nie chodzi tu o tablice 2-d, chodzi tu o tablice 1-d. Jabłka i gruszki tutaj. –

+1

Oczywiście. Twoja odpowiedź jest poprawna i elegancka w tym przypadku, nigdy nie chciałem jej krytykować. Ale biorąc pod uwagę tytuł pytania ("Transposing a NumPy array") podejrzewam, że wielu odwiedzających przyjdzie tutaj, szukając bardziej ogólnego rozwiązania i chciałem ostrzec ich, że nie dotyczy to tablic 2D. W przeciwnym razie twoja odpowiedź jest poprawna i odpowiednia, biorąc pod uwagę pytanie OP. – johndodo

0

Innym rozwiązaniem .... :-)

import numpy as np 

a = [1,2,4] 

[1, 2, 4]

b = np.array([a]).T 

array([[1], [2], [4]])

+0

Jaki jest problem z tym rozwiązaniem ?! – omotto

2

Aby 'Transpose 1D tablicy do kolumny 2d, można użyć numpy.vstack:

>>> numpy.vstack(numpy.array([1,2,3])) 
array([[1], 
     [2], 
     [3]]) 

Działa również na listach wanilii:

>>> numpy.vstack([1,2,3]) 
array([[1], 
     [2], 
     [3]]) 
+0

Nie mam pojęcia, dlaczego zostało to odrzucone, łatwe do zrozumienia i łatwe do postawienia w 1 linii –

-1

Jeśli trzeba użyć transpozycji kolumnę w rzędzie, lub odwrotnie, można użyć metody reshape() ze swojej tablicy.

Aby przenieść kolumnę w jednym rzędzie można to zrobić:

import numpy as np 
my_array = np.array([1, 2, 3, 4]) 

my_array = array([[1], [2], [3], [4]])

my_array = my_array.reshape(1, -1) 

my_array = [1, 2, 3, 4]

transpozycji wiersz z powrotem do kolumny po prostu trzeba zmienić numery w reshape() metoda

my_array = my_array.reshape(-1, 1) 

my_array = array([[1], [2], [3], [4]])