2017-07-17 1 views
1

Derzeit ich mehrere Scheiben am Zugriff auf wie folgt:Wie greifen Sie effizient mehrere Scheiben von numpy Array

Zuerst habe ich zuteilen ein Array, das viele Male

X = np.zeros((batch_size, window, 5)) 

Dies ist die neu zugeordnet werden Zuordnung Schleife, die mehrfach ausgeführt werden wird (batch_indices hat verschiedene Indizes jedes Mal, aber die gleiche Form):

for i, b in enumerate(batch_indices): 
    X[i] = Xs[b:b+window] 

gibt es eine effizientere Art und Weise? Ich fühle mich wie es sollte auf ähnliche Syntax werden:

X = Xs[ [slice(b,b+window) for b in batch_indices] ] 

Während die Form von Xs 2-dimensional ist, sollte die endgültige Form von X eine 3-dimensionalen np.array sein. Stellen Sie sich Folgendes vor: Xs ist eine lange multidimensionale Zeitreihe, und X muss ein numpliges Array sein, das viele Schichten der multidimensionalen Zeitreihe enthält.

+0

Haben Sie [Anzahl Iterationen] (https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html) untersucht? –

+0

haben Sie boolesche Indizes versucht? einen Leistungscheck wert ... – Raf

+0

Hat die veröffentlichte Lösung für Sie funktioniert? – Divakar

Antwort

2

Ansatz # 1

Ein vektorisiert Ansatz wäre, alle zu schaffen jene Gleitfenster-Indizes und Index in Xs mit denen, wie so -

X = Xs[np.asarray(batch_indices)[:,None] + np.arange(window)] 

Ansatz # 2

Ein anderer Speicher effizienter Ansatz wäre zu schaffen sliding-windows mit np.lib.stride_tricks.as_strided und damit die Schaffung des Gleitfenster-Indizes in dem vorherigen Ansatz als erledigt zu vermeiden und einfach-Index mit batch_indices, wie so -

X = strided_axis0(Xs,window)[np.asarray(batch_indices)] 

Strides basierter Funktion strided_axis0 von here ist.

Verwandte Themen