2016-06-30 17 views
8

Mam tendencję do indeksowania numpy tablic (macierzy) z nawiasami, ale zauważyłem, kiedy chcę wyciąć tablicę (macierz), muszę użyć notacji przecinka. Dlaczego to? Na przykład,Dlaczego indeksowanie numpy tablic z nawiasami i przecinkami różni się pod względem zachowania?

>>> x = numpy.array([[1, 2], [3, 4], [5, 6]]) 
>>> x 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 
>>> x[1][1] 
4     # expected behavior 
>>> x[1,1] 
4     # expected behavior 
>>> x[:][1] 
array([3, 4])  # huh? 
>>> x[:,1] 
array([2, 4, 6]) # expected behavior 
+1

Musisz zrozumieć, co 'x [1]' lub 'x [:]' robi przed zrozumieniem 'x [1] [1]' lub 'x [:] [1]'. Dwa nawiasy są stosowane sekwencyjnie, z 2 wywołania '__getitem__'. Ale w 'x [:, 1]' obie osie są rozpatrywane łącznie - przez jedno 'numpy'' __getitem__' wywołanie. – hpaulj

+0

Dziękuję @hpaulj, to jest odpowiedź, której szukam. – BoltzmannBrain

Odpowiedz

13

to:

x[:, 1] 

oznacza „ma wszystkie wskaźniki x wzdłuż pierwszej osi, ale tylko wskaźnik jeden wzdłuż drugiego.”

to:

x[:][1] 

oznacza „ma wszystkie wskaźniki x wzdłuż pierwszej osi (więc wszystkie x), następnie indeks 1 wzdłuż pierwszego osi wynik”. Stosujesz 1 do niewłaściwej osi.

x[1][2] i x[1, 2] tylko równoważne, ponieważ indeksowania tablicę liczbę całkowitą przesuwa wszystkie pozostałe osie w kierunku do przodu w stanie, więc pierwsza oś x[1] jest druga oś x. To w ogóle nie generalizuje; prawie zawsze powinieneś używać przecinków zamiast wielu kroków indeksowania.

1

Po przesunięciu wielu wymiarów tablicy, jeśli podano mniej wskaźników niż liczba osi, brakujące indeksy są uważane za pełne plasterki. W związku z tym, gdy zasadniczo robisz, wywołując x[:][1] jest x[:,:][1,:] Dlatego x[:,:] po prostu zwróci x sam.