2016-11-12 3 views
0

Ich habe ein Array a = np.arange(10). Ich möchte np.roll verwenden, wobei die Verschiebung positiv oder negativ sein kann. Ich möchte dann die Indexierung verwenden, um die Elemente zu entfernen, die am Anfang aufgefüllt wurden (wenn die Verschiebung positiv ist) oder am Ende (wenn die Verschiebung negativ ist) des Arrays. So zum Beispiel:Rollnumpy-Array ohne Polsterung?

>>> a = np.arange(10) 
>>> np.roll(a, 1)[1:] 
array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 
>>> np.roll(a, -1)[:-1] 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

Gibt es einen generischen Weg, um dies in einer einzigen Zeile zu erreichen?

+1

Was die Eingänge (Eingabefelder und Eingabeparameter) und was die erwartete Ausgabe für die Probe? Könnten Sie Ihren Beispielcode im Wesentlichen in ein Funktionsformat konvertieren? – Divakar

+0

Was meinst du mit 'padding'? – Eric

Antwort

1

Ich glaube nicht, dass es möglich ist, dies in einer generischen (nicht fest codierten) Weise zu tun. Aber es ist ziemlich einfach, eine kurze Funktion zu schreiben, die das tut, was Sie wollen.

def roll2(arr, i): 
    """Roll and clip array""" 
    if i == 0: 
     return arr 
    elif i > 0: 
     s = slice(i, None) 
    else: 
     s = slice(None, i) 
    return np.roll(a, i)[s] 
+0

möglich ein Liner: 'np.roll (a, i) [Scheibe (i, keine) wenn ich> 0 sonst (Scheibe (Keine, i) wenn ich <0 andere Scheibe (Keine))]' – hpaulj

+0

@hpaulj: A besserer Einzeiler - 'a [-i:] wenn i <= 0 sonst ein [: - i]' – Eric

+0

'np.s_ [i:]' ist auch IMO ein besserer Weg, um 'slice (i, None) zu buchstabieren ' – Eric

0

Warum verwenden Sie sogar roll hier? Der eigentliche Sinn von Roll ist das Erstellen von Wrap-Around-Verhalten, das genau das Feature zu sein scheint, das Sie zu eliminieren versuchen. Eine einfache Scheibe genügt:

def shift_right(arr, i): 
    if i <= 0: 
     return arr[-i:] 
    else: 
     return arr[:-i] 

Diese Funktion verhält sich genau wie der in David's answer