2016-09-13 2 views
1

Ich versuche, über eine lange Zeitreihe zu lauten Daten zu modellieren und zu passen, und ich möchte sehen, was mit meiner Passform passiert, wenn ich eine beträchtliche Menge von meinem entferne Daten.Wie man jeden n-ten Punkt in einer Liste behält und den Rest null macht

Ich habe eine lange Zeitreihe von Daten und ich interessiere mich nur für jeden n-ten Artikel. Allerdings möchte ich diese Liste immer noch mit der Zeit zeichnen, aber mit jedem anderen unerwünschten Element, das entfernt wurde.

Zum Beispiel für n = 4, wird die Liste

a = [1,2,3,4,5,6,7,8,9,10...] 

werden sollte

a_new = [1,0,0,0,5,0,0,0,9,0...] 

ich nichts dagegen, wenn die Position des n-ten Punkt am Anfang oder Ende der Reihenfolge ist meine Serie effektiv beliebig und so lang, dass es egal ist, was ich lösche. Zum Beispiel ‚A_New‘ könnte auch sein:

a_new = [0,0,0,4,0,0,0,8,0,0...] 

Idealerweise würde die Lösung nicht auf der Länge der Liste ab, aber ich kann diese Länge als Variable hat.

Edit 1:

Ich wollte eigentlich leere Elemente, nicht Null ist, (wenn das möglich ist?) So:

a_new = [1,,,,5,,,,9...] 

Edit 2:

ich die entsprechenden Elemente zu entfernen, benötigt meine Zeitreihe auch, so dass, wenn alles geplottet wird, jedes Datenelement den gleichen Index wie das Zeitreihenelement hat.

Danke!

+0

Als Moses vorgeschlagen, Liste Verständnis ist der Weg zu gehen, wenn Sie mit 'list' s. Wenn Sie jedoch die Analyse von Zeitreihen und Daten im Allgemeinen durchführen, ist "numpy.darray" möglicherweise besser für den Job geeignet: http://docs.scipy.org/doc/numpy/reference/generated/numpy .tarray.html –

+0

Ich denke, wir können keine Liste erstellen wie 'a_new = [1 ,,,, 5 ,,,, 9]' es gibt Fehler: 'SyntaxError: ungültige Syntax' –

Antwort

5

Verwenden Sie ein Liste Verständnis mit einem ternary conditional, die die mod jedes Elements auf der Anzahl n nimmt:

>>> a = [1,2,3,4,5,6,7,8,9,10] 
>>> n = 4 
>>> [i if i % n == 0 else 0 for i in a] 
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0] 

Falls die Daten gehen nicht inkrementell, die am wahrscheinlichsten ist, verwenden enumerate so die mod wird auf den Index und nicht auf das Element genommen:

>>> [v if i % n == 0 else 0 for i, v in enumerate(a)] 
[1, 0, 0, 0, 5, 0, 0, 0, 9, 0] 

Der Ausgangspunkt auch leicht geändert werden kann, wenn enumerate mit:

>>> [v if i % n == 0 else 0 for i, v in enumerate(a, 1)] # start indexing from 1 
[0, 0, 0, 4, 0, 0, 0, 8, 0, 0] 

Wenn Sie entfernen Ihren unerwünschten Daten beabsichtigen, anstatt sie zu ersetzen, dann ein Filterif (anstelle der Verwendung ternärer Operator) in der Liste Verständnis kann damit umgehen:

>>> [v for i, v in enumerate(a, 1) if i % n == 0] 
[4, 8] 
+0

Diese Lösung funktioniert nur, wenn die Zahlen inkrementieren in '1's. Sollte stattdessen 'val verwenden, wenn i% n == 0 else 0 für i, val in (a) nummerieren'. – SCB

+0

@SCB Das ist schon ein Teil der Antwort: P –

+0

Das ist toll vielen Dank! Ist es zweitens möglich, einfach leere Elemente anstelle von Nullen zu haben? Offensichtlich jetzt, wenn ich es plotte, sieht es chaotisch aus. Ich habe die ursprüngliche Frage bearbeitet, um dies zu berücksichtigen. –

0
[0 if i%4 else num for i, num in enumerate(a)] 
0

Hier ist ein funktionierendes Beispiel Funktionen zum Filtern von einem bestimmten Schritt K gegeben:

def filter_f(data, K=4): 
    if K <= 0: 
     return data 

    N = len(data) 
    f_filter = [0 if i % K else 1 for i in range(N)] 
    return [a * b for a, b in zip(data, f_filter)] 

f_input = range(10) 

for K in range(10): 
    print("Original function: {0}".format(f_input)) 
    print("Filtered function (step={0}): {1}".format(
     K, filter_f(f_input, K))) 
    print("-" * 80) 

Ausgang:

Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=0): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=1): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=2): [0, 0, 2, 0, 4, 0, 6, 0, 8, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=3): [0, 0, 0, 3, 0, 0, 6, 0, 0, 9] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=4): [0, 0, 0, 0, 4, 0, 0, 0, 8, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=5): [0, 0, 0, 0, 0, 5, 0, 0, 0, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=6): [0, 0, 0, 0, 0, 0, 6, 0, 0, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=7): [0, 0, 0, 0, 0, 0, 0, 7, 0, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=8): [0, 0, 0, 0, 0, 0, 0, 0, 8, 0] 
-------------------------------------------------------------------------------- 
Original function: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Filtered function (step=9): [0, 0, 0, 0, 0, 0, 0, 0, 0, 9] 
-------------------------------------------------------------------------------- 
Verwandte Themen