2015-07-14 14 views
6

Gdybym pokroić 2d tablicę z zestawu współrzędnychOdcinanie 3d numpy tablicy zwraca dziwny kształt

>>> test = np.reshape(np.arange(40),(5,8)) 
>>> coords = np.array((1,3,4)) 
>>> slice = test[:, coords] 

wtedy mój plaster ma kształt, który spodziewałbym

>>> slice.shape 
(5, 3) 

ale gdybym powtórzyć z 3d tablicy

>>> test = np.reshape(np.arange(80),(2,5,8)) 
>>> slice = test[0, :, coords] 

czym kształt jest

>>> slice.shape 
(3, 5) 

Czy jest jakiś powód, że są różne? Oddzielenie indeksów zwraca kształt, który byłby oczekiwany, aby uzyskać różne kształty. Dlaczego te widoki mają różne kształty?

+0

Nawiasem mówiąc, nie związane z pytaniem, 'slice()' jest pyton wbudowane, https://docs.python.org/2/library/functions.html#slice. Możesz go użyć, aby nadać nazwę obiektowi plasterka. – Scott

Odpowiedz

5
slice = test[0, :, coords] 

jest prosta indeksowanie, w efekcie mówiąc „podjęcia 0TH element pierwszego współrzędnych wszystkie z drugiej współrzędnej i [1,3,4], z trzecim współrzędnych”. A dokładniej, weź współrzędne (0, cokolwiek, 1) i uczyń go naszym pierwszym rzędem, (0, cokolwiek, 2) i uczyń go naszym drugim rzędem, i (0, cokolwiek, 3) i uczyńmy nasz trzeci rząd. Istnieje 5 whatevers, więc kończysz z (3,5).

Drugi przykład dałeś jest tak:

slice = test[0][:][coords] 

W tym przypadku jesteś patrząc na (5,8) tablicy, a następnie biorąc 1., 3. i 4. elementy, które są 1., 3. i 4. rzędy, więc kończysz z tablicą (5,3).

Edytuj, aby omówić sprawę 2D:

W przypadku 2D, gdzie:

>>> test = np.reshape(np.arange(40),(5,8)) 
>>> test 
array([[ 0, 1, 2, 3, 4, 5, 6, 7], 
     [ 8, 9, 10, 11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29, 30, 31], 
     [32, 33, 34, 35, 36, 37, 38, 39]]) 

zachowanie jest zbliżone.

Przypadek 1:

>>> test[:,[1,3,4]] 
array([[ 1, 3, 4], 
     [ 9, 11, 12], 
     [17, 19, 20], 
     [25, 27, 28], 
     [33, 35, 36]]) 

jest po prostu wybranie kolumn 1,3 i 4.

Przypadek 2:

>>> test[:][[1,3,4]] 
array([[ 8, 9, 10, 11, 12, 13, 14, 15], 
     [24, 25, 26, 27, 28, 29, 30, 31], 
     [32, 33, 34, 35, 36, 37, 38, 39]]) 

bierze 1., 3. i 4. elementem array, które są wierszami.

+1

Ma to sens w przypadku 3d, ale dlaczego sprawa 2d jest inna? Dlaczego nie bierze (cokolwiek, 1) jako pierwszy rząd? –

+1

Więc kiedy umieścisz 0 w przypadku 3D, oznacza to, że masz mieszankę prostego i zaawansowanego indeksowania. Zaawansowany indeks zawsze staje się pierwszym indeksem, który go zamienia. –

+1

W przypadku 2D nie ma mieszaniny, więc zachowuje istniejącą kolejność. –

4

http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

Docs mówić o złożoności łącząc zaawansowane i podstawowe indeksowanie.

test[0, :, coords] 

Indeksowanie coords przychodzi pierwszy, z [0,:] po produkując ten (3,5).

Najprostszym sposobem zrozumienia sytuacji może być myślenie w kategoriach kształtu wyniku.Są dwie części operacji indeksowania, podprzestrzeń zdefiniowana przez podstawowe indeksowanie (z wyłączeniem liczb całkowitych) i podprzestrzeń z zaawansowanej części indeksującej. [w przypadku, gdy]

Zaawansowane indeksy są oddzielone plasterkiem, elipsą lub newaxis. Na przykład x [arr1,:, arr2]. .... wymiary wynikające z zaawansowanej operacji indeksowania są na pierwszym miejscu w tablicy wyników, a wymiary podprzestrzeni po niej.

Przypominam sobie omawianie tego rodzaju indeksowania w poprzednim pytaniu dotyczącym SO, ale znalezienie go wymagałoby trochę wysiłku.

https://stackoverflow.com/a/28353446/901925Why does the order of dimensions change with boolean indexing?

How does numpy order array slice indices?


[:] w test[0][:][coords] robi nic. test[0][:,coords] daje oczekiwany wynik (5,3).

In [145]: test[0,:,[1,2,3]] # (3,5) array 
Out[145]: 
array([[ 1, 9, 17, 25, 33], # test[0,:,1] 
     [ 2, 10, 18, 26, 34], 
     [ 3, 11, 19, 27, 35]]) 

In [146]: test[0][:,[1,2,3]] # same values but (5,3) 
Out[146]: 
array([[ 1, 2, 3], 
     [ 9, 10, 11], 
     [17, 18, 19], 
     [25, 26, 27], 
     [33, 34, 35]]) 

In [147]: test[0][:][[1,2,3]] # [:] does nothing; select 3 from 2nd axis 
Out[147]: 
array([[ 8, 9, 10, 11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29, 30, 31]]) 

In [148]: test[0][[1,2,3]] # same as test[0,[1,2,3],:] 
Out[148]: 
array([[ 8, 9, 10, 11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29, 30, 31]]) 
+0

Ta odpowiedź ma wiele sensu, ale nadal nie wyjaśnia, dlaczego przypadek 2D zachowuje się tak, jak to robi! – DilithiumMatrix