2014-06-25 17 views
10

Chciałbym dynamicznie wyciąć tablicę numpy wzdłuż konkretnej osi. Biorąc pod uwagę to:Cięcie tablicy numpy wzdłuż dynamicznie określonej osi

axis = 2 
start = 5 
end = 10 

chcę osiągnąć ten sam rezultat jak to:

# m is some matrix 
m[:,:,5:10] 

Korzystanie coś takiego:

slc = tuple(:,) * len(m.shape) 
slc[axis] = slice(start,end) 
m[slc] 

ale wartości : nie można umieścić w tuple, więc nie mogę wymyślić, jak zbudować plaster.

+0

Jak wygląda "m"? – MrAlias

+0

@MrAlias ​​To nie ma znaczenia. Pytanie brzmi: jak dynamicznie budować plaster. –

Odpowiedz

12

Myślę, że jednym ze sposobów byłoby użyć slice(None):

>>> m = np.arange(2*3*5).reshape((2,3,5)) 
>>> axis, start, end = 2, 1, 3 
>>> target = m[:, :, 1:3] 
>>> target 
array([[[ 1, 2], 
     [ 6, 7], 
     [11, 12]], 

     [[16, 17], 
     [21, 22], 
     [26, 27]]]) 
>>> slc = [slice(None)] * len(m.shape) 
>>> slc[axis] = slice(start, end) 
>>> np.allclose(m[slc], target) 
True 

Mam niejasne wrażenie Użyłem funkcji dla tego wcześniej, ale ja nie potrafię go znaleźć teraz ..

+0

Dzięki ... to rozwiązuje problem. 'slice (None)' jest najwyraźniej równoznaczne z ':'. –

4

To trochę za późno na imprezę, ale domyślny sposób Numpy to zrobić to numpy.take. Jednak ten jeden zawsze kopiuje dane (ponieważ obsługuje wymyślne indeksowanie, zawsze zakłada, że ​​jest to możliwe). Aby tego uniknąć (w wielu przypadkach będzie chcesz widok z danymi, a nie kopia), przełączenie na opcję slice(None) już wspomniano w innych odpowiedzi, ewentualnie owijając go w miłym funkcji:

def simple_slice(arr, inds, axis): 
    # this does the same as np.take() except only supports simple slicing, not 
    # advanced indexing, and thus is much faster 
    sl = [slice(None)] * arr.ndim 
    sl[axis] = inds 
    return arr[sl] 
1

jako że nie został wymieniony na tyle jasno (i szukałem dla niego zbyt):

odpowiednik:

a = my_array[:, :, :, 8] 
b = my_array[:, :, :, 2:7] 

jest:

a = my_array.take(indices=8, axis=3) 
b = my_array.take(indices=range(2, 7), axis=3) 
Powiązane problemy