2012-11-05 17 views
7

Pracuję z tablicą n-wymiarową i chciałbym sposób na odwrócenie numerowanego wymiaru. Więc zamiastOdwróć dowolny wymiar w ndarray

rev = a[:,:,::-1] 

Chciałbym móc napisać

rev = a.reverse(dimension=2) 

lub coś podobnego. Nie mogę znaleźć przykładów, które nie opierają się na wcześniejszej składni.

+0

Jeśli znasz składnię, której potrzebujesz, możesz włączyć ją do swojej własnej funkcji "rev"? – Makoto

+0

Byłbym z tym w porządku, ale chcę, aby funkcja wzięła liczbę całkowitą (wymiar do odwrócenia) i zwróciła tablicę odwróconą wzdłuż tego wymiaru. Nie wiem jak przetłumaczyć (na przykład) '1' na' [:, :: - 1,:] 'i' 0' na '[:: - 1,:,:]' dla dowolnej liczby wymiary. Plasterek – Shep

Odpowiedz

1

dla każdego, napotykając to w przyszłości:

Numpy 1.12+ ma funkcję np.flip(array, dimension), która działa dokładnie tak, jak żądano. Co więcej, zwraca widok danych zamiast kopii, a więc dzieje się to w stałym czasie.

9

Jeśli przeglądasz kod źródłowy numpy (python), znajdziesz sztuczkę, której używają do pisania funkcji działających na danej osi, aby użyć np.swapaxes do ustawienia osi celu w pozycji axis = 0. Następnie zapisują kod działający pod numerem 0-axis, a następnie ponownie używają np.swapaxes, aby ponownie umieścić 0-axis w pierwotnej pozycji.

Można to zrobić tutaj tak:

import numpy as np 
def rev(a, axis = -1): 
    a = np.asarray(a).swapaxes(axis, 0) 
    a = a[::-1,...] 
    a = a.swapaxes(0, axis) 
    return a 

a = np.arange(24).reshape(2,3,4) 

print(rev(a, axis = 2)) 

plony

[[[ 3 2 1 0] 
    [ 7 6 5 4] 
    [11 10 9 8]] 

[[15 14 13 12] 
    [19 18 17 16] 
    [23 22 21 20]]] 
6

okazuje można to zrobić z slice, dla których : jest skrótem w niektórych kontekstach. Sztuką jest, aby zbudować obiekt indeksu jako krotki plastrów:

import numpy as np 

def reverse(a, axis=0): 
    idx = [slice(None)]*len(a.shape) 
    idx[axis] = slice(None, None, -1) 
    return a[idx] 

a = np.arange(24).reshape(2,3,4) 
print reverse(a, axis=2) 

Z Ellipsis może to być zwinięte w jedną wkładką:

a[[slice(None)]*axis + [slice(None, None, -1)] + [Ellipsis]] 
+0

jest najlepszy! – David