Seite 1 von 1
Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 12:58
von vinc00
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 13:21
von Sirius3
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])
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 13:38
von vinc00
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
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 14:27
von Sirius3
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 15:54
von vinc00
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

Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 16:14
von Sirius3
Wie man Arrays abmaskiert zeigen doch schon Deine ersten Codebeispiele.
if-Schleifen gibt es nicht.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 16:25
von __blackjack__
@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/
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 17:10
von vinc00
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 17:16
von Sirius3
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)
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 18:20
von vinc00
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 18:26
von __blackjack__
@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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 18:49
von vinc00
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.
Re: Array Werte mit zu geringem Abstand löschen
Verfasst: Dienstag 22. November 2022, 19:28
von Sirius3
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?