Array Werte mit zu geringem Abstand löschen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Hallo zusammen,

ich muss ein Array bearbeiten, dass zwei Spalten hat eine für X-Werte und eine für Y-Werte. Die X-Werte sind 0.0025er Schritte (0, 0.0025, 0.005, etc.), aber manchmal sind da auch falsche Schritte drin wie [0, 0.0025, 0.0035, 0.005], manchmal wird dann auch mit den flaschen werten weitergerechnet [0, 0.0025, 0.0035, 0.006, 0.0085].

Ich hab bis jetzt folgendes probiert:

Code: Alles auswählen

    start = data[0, 0]
    data = data[~np.r_[True, (np.diff(data[:,0])>0)&(np.diff(data[:, 0])<0.0024)]]   #falsche Schritte löschen    
    np.insert(data, 0, start)
Da habe ich aber das Problem, dass der erste Wert immer gelöscht wird und es werden nicht nur die flaschen Schritte sondern auch der darauffolgende Wert gelöscht, da ja bei beiden der Abstand zu klein ist.
Deswegen hat mir ein Kollege folgendes empfohlen, allerdings wird bei dem der falsche Schritt garnicht erst gelöscht.

Code: Alles auswählen

    
    start = 0;
    stop=data.shape[0]*0.0025
    data[np.isclose(data[:, 0], np.arange(start, stop, 0.0025))]  #falsche schritte löschen
Wäre super wenn mir jemand helfen könnte.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Schön wäre es, wenn Du gleich Beispieldaten mitlieferst, so dass man das direkt ausführen kann. Denn der zweite Code löscht etwas. Die Frage ist ja nur, sollen alle Schritte gelöscht werden, sobald man einmal aus dem Takt ist, was ja Dein zweiter Code tut. Oder sollen nur die falschen Werte gelöscht werden? Was soll dann mit fehlenden Werten passieren?

Code: Alles auswählen

STEP_SIZE = 0.0025
data = np.array([0, 0.0025, 0.0035, 0.005])
np.isclose(data, np.arange(0, len(data) * STEP_SIZE, STEP_SIZE))
# array([ True,  True, False, False])
Ich habe es so verstanden, dass Du eigentlich nur die fehlerhaften Werte ignorieren willst:

Code: Alles auswählen

np.isclose((data / STEP_SIZE).round() * STEP_SIZE, data)
# array([ True,  True, False,  True])
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Hier sind einmal Beispielsdaten :
https://docs.google.com/document/d/1qq ... p=sharing

(dass die zeilen gelöscht werden wo es keine y-werte gibt habe ich mit

Code: Alles auswählen

    data = data[~np.isnan(data[:,1])] 
hinbekommen)

als kleine Info: zwischen 4.115 und 4.1175 ist ein falscher Schritt

Was die Werte angeht, sollen immer nur die flaschen Schritte gelöscht werden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du machst es den Helfenden wirklich schwierig.
Hast Du mein Beispiel gesehen? Das enthält eine kurze Liste an Beispieldaten, den Code und den Output.
In Deinem Fall wäre dann noch eine genaue Beschreibung, was Du statt dem Output anderes erwartet hättest.
Du postest aber irgendein komisches Google-Dokument, wo jeder jetzt selbst die Zahlen rauspobeln soll und noch Code schreiben, der diese Zahlen in ein numpy-Array lädt.
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Oh sorry, dann habe ich dich falsch verstanden. Mein Problem ist halt auch dass ich absoluter Anfänger bin.

Aber ich hätte mir ungefähr sowas vorgestellt:

Code: Alles auswählen


STEP_SIZE = 0.0025
#data([0, 1], 
	[0.0025, 1], 
	[0.005, 2], 
	[0.006, 3], 
	[0.0075, 4])
if np.isclose(data[:, 0], np.arange(0, len(data) * STEP_SIZE, STEP_SIZE)) == true:
	np.delete(data[:, 0][:, 1])
# data([0, 1], 
	[0.0025, 1], 
	[0.005, 2], 
	[0.0075, 4])

Mir wurde bloß schon häufiger gesagt, dass man bei Python, arrays nicht mit if Schleifen bearbeitet und die Console sagt mir dann auch

Code: Alles auswählen

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Ich hoffe damit kann man mehr anfangen :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie man Arrays abmaskiert zeigen doch schon Deine ersten Codebeispiele.
if-Schleifen gibt es nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vinc00: Bitte realen Code zu Fehlermeldungen zeigen. Bei dem Code würde ich ja mindestens eine Ausnahme erwarten weil `true` nicht existiert. Python unterscheidet zwischen Gross- und Kleinbuchstaben in Bezeichnern.

Was sollte die ``if``-Bedingung denn auch konkret bedeuten? Schau Dir doch mal an was da als konkreter Wert bei dem Ausdruck heraus kommt, der da als Bedingung steht. Wie würdest Du entscheiden wollen ob das nun wahr ist und der ``if``-Zweig ausgeführt wird, oder eben nicht? Die Fehlermeldung sagt ja, dass das mehrdeutig ist. Und auch wie man das beseitigen könnte. Falls das denn überhaupt sinnvoll wäre.

In der Dokumentation zu `delete()` steht nicht nur, dass die Funktion *zwei* Argumente erwartet und welche das sind, sondern auch die Notiz, dass häufig eine ”Maske” aus Wahrheitswerten zu bevorzugen ist. Mit Beispiel.

Dann noch der Klassiker: http://if-schleife.de/
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Mein Problem ist das dieser Code:

Code: Alles auswählen

    start = 0;
    stop=data.shape[0]*0.0025
    data[np.isclose(data[:, 0], np.arange(start, stop, 0.0025))]
nichts verändert. Die anzahl an reihen im array sind vorher und nachher gleich. Mir wird aber auch kein Error angezeigt den ich hier reinschicken könnte. Deswegen weiß ich nicht was ich euch zeigen soll.

Das mit der if-Bedingung sollte nur veranschaulichen das ich die reihen gelöscht haben möchte.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du machst ja nichts mit dem neu erzeugten Array. Jetzt können wir nicht wissen, ob das nur wegen des abgekürzten Codes ist, und was Du hier mit was vergleichst. Ich vermute mal, Du erwartest, dass sich auch magische Weise `data` ändert, nur weil Du per Index-Zugriff darauf zugreifst.
Also um das nochmal deutlich zu machen:

Code: Alles auswählen

filtered_data = data[np.isclose(data, np.arange(0, len(data) * STEP_SIZE, STEP_SIZE))]
print(data.shape, filtered_data.shape)
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Ok, dann ist hier einmal die ganze Methode.

Code: Alles auswählen


def prep(data):
    data = data[~np.isnan(data[:,1])]     #leere zellen löschen
    
    STEP_SIZE = 0.0025
    filtered_data = data[np.isclose(data[:, 0], np.arange(0, len(data) * STEP_SIZE, STEP_SIZE))]
     
    if filtered_data[0, 1] < filtered_data[-1, 1]:                   #so umdrehen dass kleinster wert unten                                 
         filtered_data=np.flipud(filtered_data)

    filtered_data[:,0] = np.arange(len(filtered_data)) * STEP_SIZE     #neue Aufzählung in 0.0025 Schritten
    
    return filtered_data

Wenn ich dass jetzt so angepasst habe wird mir folgender Error angezeigt:

Code: Alles auswählen

if filtered_data[0, 1] < filtered_data[-1, 1]:                   #so umdrehen dass kleinster wert unten
IndexError: index 0 is out of bounds for axis 0 with size 0
der Variablenmanager von Spyder sagt auch, dass filtered_data eine größe von (0,2) hat. Ich weiß aber nicht wieso.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@vinc00: Weil halt ein bisschen 😉 zu viel rausgefiltert wurde. Warum? Dazu müsstest Du Dir wohl die Zwischenwerte anschauen an welcher Stelle etwas anderes passiert als Du erwartest.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
vinc00
User
Beiträge: 13
Registriert: Freitag 21. Oktober 2022, 11:34

Ja, wie es scheint liegt es wohl hieran:

Code: Alles auswählen

    filtered_data = data[np.isclose(data[:, 0], np.arange(len(data) * STEP_SIZE, STEP_SIZE), rtol=0.001)]
Ich hab schon überlegt ob es am rtol liegen könnte, aber das scheint es auch nicht zu sein.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich habe Dir ja schon erklärt, wie diese Filterung funktioniert. Anscheinend möchtest Du aber auch Werte erlauben, die von Groß nach Klein angeordnet sind, das filtert aber dieser Filter komplett weg.

Deshalb nochmal meine Fragen: wie soll den mit Werten, die abweichen, umgegangen werden?
Antworten