2017-08-17 2 views
-1

Sagen, ich habe ein Array wie folgt:Wie erstelle ich ein gleitendes Fenster mit einer 50% Überlappung mit einem numply Array?

array([1, 2, 3, 4, 5, 5, 7, 8, 9, 10]) 

ich es

array([1, 2, 3, 4]), array([3, 4, 5, 6]), array([5, 6, 7, 8]), array([7, 8, 9, 10]) 

Hier wird die Fenstergröße 4 ändern wollen würde, und Schrittgröße würde 2 sein.

Wie kann ich dies in einer Python-Funktion tun?

+1

Sieht aus wie grundlegende numpy-Verwendung. Was hast du versucht? Sie müssen natürlich neue Arrays erstellen, also haben Sie ein List-Verständnis versucht, wobei der Startindex controlley von pythons range() mit step? – sascha

+0

Möchten Sie vier separate Arrays anstelle eines einzelnen 4x4-Arrays? Letzteres könnte praktischer sein und ist nur eine Anwendung von [as_strided] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.lib.stride_tricks.as_strided.html). –

+0

Ich möchte letzteres – dirtysocks45

Antwort

2

Sie wollen numpy.lib.stride_tricks.as_strided

def window(a, w = 4, o = 2, copy = False): 
    sh = (a.size - w + 1, w) 
    st = a.strides * 2 
    view = np.lib.stride_tricks.as_strided(a, strides = st, shape = sh)[0::o] 
    if copy: 
     return view.copy() 
    else: 
     return view 

Out[]: 
array([[ 1, 2, 3, 4], 
     [ 3, 4, 5, 6], 
     [ 5, 6, 7, 8], 
     [ 7, 8, 9, 10]]) 

Seien Sie sicher, copy = True es zu setzen, wenn Sie an das fenster Array schreiben möchten, da sonst ist es ein Speicher-Sharing-Ansicht.

+0

Wo würde ich 'copy()' hinzufügen? – dirtysocks45

+0

Editierte Antwort zu klären, auch die Offsets behoben, da das nur für Ihr Spielzeug Problem vor –

+0

'Erwarteter Typ 'Optional [Iterable [int]]', bekam' int 'stattdessen für 'strides = st' – dirtysocks45

Verwandte Themen