2012-11-05 9 views
7

Ich arbeite mit einem n-dimensionalen Array und möchte eine Möglichkeit, eine nummerierte Dimension umzukehren. Also anstattEine beliebige Dimension in einem NDarray umkehren

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

würde Ich mag Lage sein, zu schreiben

rev = a.reverse(dimension=2) 

oder etwas ähnliches. Ich kann nicht scheinen, Beispiele zu finden, die nicht auf der ehemaligen Syntax beruhen.

+0

Wenn Sie die Syntax kennen, die Sie brauchen, warum rollen Sie das nicht in Ihre eigene "rev" -Funktion? – Makoto

+0

Damit wäre ich in Ordnung, aber ich möchte, dass die Funktion eine Ganzzahl (die umzubrechende Dimension) annimmt und das Array umgekehrt in dieser Dimension zurückgibt. Ich weiß nicht, wie man (zum Beispiel) '1' in' [:, :: - 1,:] und '0' in' [:: - 1,:,:] '' für eine beliebige Zahl von Maße. – Shep

Antwort

1

Für alle über diese kommen in der Zukunft:

Numpy 1.12+ hat die Funktion np.flip(array, dimension), die genau wie gewünscht funktioniert. Noch besser, es gibt eine Ansicht der Daten statt einer Kopie zurück, und so geschieht es in konstanter Zeit.

9

Wenn Sie den numpy (Python) Quellcode durchsuchen, finden Sie einen Trick, den sie verwenden, um Funktionen zu schreiben, die auf einer bestimmten Achse arbeiten, np.swapaxes zu verwenden, um die Zielachse in der axis = 0 Position zu setzen. Dann schreiben sie Code, der auf der 0-axis funktioniert, und dann verwenden sie wieder np.swapaxes, um die 0-axis wieder in ihrer ursprünglichen Position zu setzen.

Sie können das hier tun wie so:

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)) 

Ausbeuten

[[[ 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

dies stellte sich heraus, kann mit slice erfolgen, für die : Stenografie in manchen Kontexten ist. Der Trick ist, das Index-Objekt als ein Tupel von Scheiben zu bauen:

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) 

Mit Ellipsis kann dies in einen Einzeiler kollabiert werden:

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

Scheibe ist das Beste! – David