Den ersten, nähersten Wert finden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Yurii
User
Beiträge: 6
Registriert: Dienstag 26. April 2022, 11:15

Hallo Zusammen,
ich möchte in einem array die Position vom ersten, nähersten Wert finden.

Zum Beipiel, ich habe ich einen Sinus verlauf:

Code: Alles auswählen

import numpy as np

werte = [1, 2, 3, 4.1, 5, 6, 5, 4.01, 3, 2, 1, -1, -2, -3, -4.1, -5, -6, -5,-4.01, -3, -2, -1]
suchwert = 4
index=abs(np.array(werte)-suchwert).argmin()
print("Das Listenelement mit der geringsten Abweichung ist:",werte[index],"Listenindex:",index)
In diesem Fall bekomme ich:
"Das Listenelement mit der geringsten Abweichung ist: 4.01 Listenindex: 7"
Es ist 100% richtig.

Aber,
da ich mit den Messwerten arbeite, weiß ich, dass der Wertt "4.1" in meinem Fall richtiger ist, obwohl "4.01" zu 4 als nächstes ist.

Meine erste überlegung ist mit den Daten Typ spielen. Z.B. alle werte im vektor "werte" in "int" konvertieren.
Konnte diese Frage inteliegenter gelöst werden?

Noch eine Frage:

wie würd der Code aussehen, wenn der Suchwert ein Batrag (abs) wäre? weil "4.1" positiv oder nägativ sein kann.
Vielen Dank für die Antwort im Voraus!

mfg Yurii
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist leider so kein loesbares Problem. Denn wenn nur *du* weisst, dass einige Werte besser sind als andere, dann koennen wir das auch nicht beantworten. Wenn du also kein programmierbares Kriterium nennen kannst, nach dem du 4.1 einer 4.01 vorziehst, bleibt es dabei.

Mit abs sieht der Code genauso aus, du musst nur vorher die Werte einmal durch abs jagen, das geht ja auch mit numpy, steht in der Doku.
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

Ansatz: Man könnte eine Funktion `f` an die Messwerte anfitten und dann `suchwert = f(x)` nach x auflösen. Damit hätte man alle `x`-Werte, die zum Suchwert passen und muss nur noch den richtigen (kleinsten? Das geht aus deiner Beschreibung nicht hervor.) finden. Der gesuchte Arrayindex liegt dann in einer kleinen Umgebung um das gefundene x.

Dafür bräuchtest du halt eine (physikalisch sinnvolle) Funktion, die deine Messwerte beschreibt.
tonikae
User
Beiträge: 90
Registriert: Sonntag 23. Februar 2020, 10:27

Der Algorithmus den du suchst heißt: "Nearest Neighbors" - Kurzform: K-NN
Wobei K die Anzahl der zu findenden Neighbors ist...in deinem Fall wäre K =1, weil du ja nur einen nächsten Wert suchst

Beim "Nearest Neighbors"-Algorithmus hat man zunächst einmal , eine beliebige Datenmenge,
Darin definiert man dann einen oder mehrere Referenzpunkte und dann wird mit dem
K-NN-Algorithmus ermittelt, welche Werte am nächsten zu dem jeweiligen Referenzpunkt sind,
Als Diagramm kann das dann so aussehen

https://drive.google.com/file/d/11P2Wf6 ... 1QYOi/view

Für Python kann dir das evtl. weiterhelfen
https://realpython.com/knn-python/
Yurii
User
Beiträge: 6
Registriert: Dienstag 26. April 2022, 11:15

Hallo Zusammen,

Viele Dank für die Hilfe.

Ich habe eine Lösung gefunden, obwohl nich so schön und intelegent wie Ihre :) ICh probiere auf jeden Fall ihre warianten auch, aber ich sollte die lössung so schnell wie möglich finden. Deswegen habe ich improvisiert.

Da mein Krieterieum den ersten, nähersten Wert (zu 4) zu finden war, habe ich einfach alle werte im Vektor in "int" konvertiert. In diesem neuen Vektor habe ich eifach die Koordinate (Index) der ersten Ziffer 4 abgelesen. Diese koordinate ist die koordinate vom gesuchten Wert im ursprünglichen Vektor. Nicht so effizient aber funktioniert .
Antworten