2013-03-18 22 views
6

Niech a będzie listą w python.Generalizowanie transpozycji macierzy w numpy

a = [1,2,3] 

Kiedy transpozycja macierzy jest stosowany do a, otrzymujemy:

np.matrix(a).transpose() 
matrix([[1], 
     [2], 
     [3]]) 

szukam uogólnić tę funkcjonalność, a obok zilustrować co szukam to zrobić za pomocą przykładu. Niech inna lista to b.

b = [[1, 2], [2, 3], [3, 4]] 

W a, elementy listy są 1, 2 i 3. Chciałbym rozważyć każdy z [1,2], [2,3] i [3,4] jako elementów listy w b, wyłącznie w celu wykonywania transpozycję. Chciałbym wyjście będzie w następujący sposób:

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

Zasadniczo chciałbym być w stanie określić jaki element lista będzie wyglądać, i przeprowadzić transpozycję macierzy w oparciu o to.

Mogę po prostu napisać kilka linii kodu, aby to zrobić, ale moim celem zadawania tego pytania jest sprawdzenie, czy istnieje wbudowana funkcja numpy lub pytonowo, aby to zrobić.

EDYCJA: dane wyjściowe polecenia unutbu odpowiadają wynikom, które mam powyżej. Jednak chciałem rozwiązania, które zadziałałoby w bardziej ogólnym przypadku. Poniżej zamieściłem inne dane wejściowe/wyjściowe. Mój pierwszy przykład nie był wystarczająco szczegółowy, by przekazać to, co chciałem powiedzieć. Niech pozycje w b będą [1,2], [2,3], [3,4] i [5,6]. Następnie wynik podany poniżej byłby wykonaniem transpozycji macierzy na elementy o wyższych wymiarach. Mówiąc ogólniej, kiedy opiszę, jak mógłby wyglądać element, chciałbym wiedzieć, czy istnieje sposób na dokonanie transpozycji.

Input: b = [[[1, 2], [2, 3]], [[3, 4], [5,6]]] 
Output: array([[[1,2], [3,4]], 
       [[2,3], [5,6]]]) 
+0

Możesz użyć krotek zamiast list, aby wskazać niepodzielne elementy matrycy. –

+0

Macierze NumPy są zawsze dwuwymiarowe. Twoja pożądana matryca jest trójwymiarowa. – unutbu

+0

Czy zmienił się problem lub edytował rozwiązanie na pytanie? –

Odpowiedz

4

Żądana tablica ma kształt (3,1,2). b ma kształt (3,2). Aby przykleić dodatkową oś w środku, użyj b[:,None,:] lub (równoważnie) b[:, np.newaxis, :]. Poszukaj "newaxis" w section on Basic Slicing.

In [178]: b = np.array([[1, 2], [2, 3], [3, 4]]) 

In [179]: b 
Out[179]: 
array([[1, 2], 
     [2, 3], 
     [3, 4]]) 

In [202]: b[:,None,:] 
Out[202]: 
array([[[1, 2]], 

     [[2, 3]], 

     [[3, 4]]]) 

Innym userful narzędzie jest np.swapaxes:

In [222]: b = np.array([[[1, 2], [2, 3]], [[3, 4], [5,6]]]) 

In [223]: b.swapaxes(0,1) 
Out[223]: 
array([[[1, 2], 
     [3, 4]], 

     [[2, 3], 
     [5, 6]]]) 

transpozycję, b.T jest taka sama jak zamiana pierwsze i ostatnie osie, b.swapaxes(0,-1):

In [226]: b.T 
Out[226]: 
array([[[1, 3], 
     [2, 5]], 

     [[2, 4], 
     [3, 6]]]) 

In [227]: b.swapaxes(0,-1) 
Out[227]: 
array([[[1, 3], 
     [2, 5]], 

     [[2, 4], 
     [3, 6]]]) 

Podsumowanie:

  • Użyj np.newaxis (lub None), aby dodać nowe osie. (W ten sposób zwiększając wymiar tablicy)
  • Aby zamienić dwie osie, użyj np.swapaxes.
  • Użyj np.transpose, aby przesłać wszystkie osie naraz. (Podziękowania dla @jorgeca za wskazanie tego.)
  • Użyj np.rollaxis, aby "obrócić" osie.
+0

Właśnie zmieniłem typ pliku wyjściowego w moim poście, aby pasował do twojego. Jeśli jednak spojrzysz na swoje wyniki, nie zgadza się z tym określonym w moim poście. Można sobie wyobrazić, że moje dane wyjściowe będą matrycą kolumn, której pozycjami są wszystkie listy. – rsimha

+0

@rsimha: Rzeczywiście błędnie przeczytałem umieszczenie nawiasów. Żądana tablica ma kształt (3,1,2). "b" ma kształt (3,2). Aby wstawić dodatkowy wymiar (err, "axis") w środku, użyj 'b [:, None,:]'. – unutbu

+0

Dzięki. To pasuje do danych wyjściowych w moim poście. Jednak chciałem rozwiązania, które zadziałałoby w bardziej ogólnym przypadku. Opublikowałem inne wejście/wyjście. Mój pierwszy przykład nie był wystarczająco szczegółowy, by przekazać to, co chciałem powiedzieć. – rsimha

Powiązane problemy