Seite 1 von 1
Algorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 22:20
von mathman
Guten Abend
folgendes Problem,
ich habe ein Array welches meine X-Werte enthält also z.B.
[0,0.25,0.5,0.75,1.0,1.25 ...]
Dann habe ich einen Wert z.B. 0.6. Jetzt möchte ich die Stelle von dem X Array wissen die am nächsten dran ist. Also hier wäre es die 3. mit dem Index 2
Leider fällt mir kein Lösungsschema dafür ein, welches mit allen Werten funktionieren würde

Kann mir jemand einen Ansatz geben ?
Gruß
Re: Alorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 22:30
von syntor
Code: Alles auswählen
>>> werte = [0, 0.25, 0.5, 0.75, 1.0]
>>> werte.index(min(werte, key=lambda x: abs(x - 0.6)))
2
Re: Alorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 22:37
von cofi
Also bei dem Titel solltest du nochmal nacharbeiten ...
Mal als Denkanstoss (nimmt die Zahl, die am nahesten ist, ist aber steuerbar durch das lambda):
Code: Alles auswählen
In [20]: import operator
In [21]: import itertools
In [22]: cur_pos = 0.6
In [23]: a = [0,0.25,0.5,0.75,1.0,1.25]
In [24]: b = map(lambda x: abs(cur_pos - x), a)
In [25]: c = zip(b, itertools.count(0))
In [26]: min(c, key=operator.itemgetter(0))
Out[26]: (0.099999999999999978, 2)
In [27]: a[_[1]]
Out[27]: 0.5
Re: Alorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 22:43
von mushroom
Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden
0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
Re: Alorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 23:03
von syntor
mushroom hat geschrieben:Alos ich würde ganz ohne die Liste arbeiten. Einfach den Wert - hier 0.6 - nehmen und durch den x-Abstand - hier 0.25 - dividieren. Ist die erste Dezimalstelle größer gleich 5, aufrunden -> gesuchte Stelle; ist Ergebnis kleiner gleich 5, abrunden
0.625/0.25 = 2.5 -> 3
0.6/0.25 -> 2
0.3/0.25 -> 3
Kannst du mir erlären, was du hier genau machst?
Re: Alorythmus zum Stellensuchen
Verfasst: Montag 7. März 2011, 23:10
von mushroom
syntor hat geschrieben:Kannst du mir erlären, was du hier genau machst?
Steht ja eigentlich schon da.
Die x-Werte in der Liste haben einen konstanten Abstand, hier 0.25.
Den Wert, hier 0.6, dividiere ich gerade durch diesen Abstand, ergibt 0.6/0.25 = 2.4.
Ist die erste Dezimalstelle kleiner 5, liefert Abrunden des vorigen Ergebnisses den gesuchten Index, also 4<5 -> 2.4 = 2.
Ist die erste Dezimalstelle größer/gleich 5, liefert Aufrunden den gesuchten Index. Beispiel:
0.63/0.25 = 2.52 -> 3
Hat der Wert den gleichen Abstand zu zwei benachbarten x-Werten, muß man sich natürlich entscheiden, on Auf- oder Abrunden:
0.625/0,25 = 2.5 -> 3 (nach obiger Beschreibung)
Nachtrag: Sehe gerade, daß meinem vorherigen Beitrag statt
0.3/0.25 -> 3
dies
0.63/0.25 -> 3
hätte stehen müssen.
Nachtrag 2: Dein bereits in Python umgesetzter Ansatz sieht aber auch ganz gut aus. Hatte den erst jetzt gesehen, nachdem ich meinen ersten Beitrag gepostet habe. Das kommt davon, wenn man zuviel Tabs gleichzeitig öffnet

Würde jetzt aber mit meinen laienhaften Kenntnissen sagen, daß man bei deiner Umsetzung die Art der Rundung (kaufmännisch, mathematisch) nicht beeinflussen kann. Lasse mich aber gerne eines Besseren belehren.
Re: Alorythmus zum Stellensuchen
Verfasst: Dienstag 8. März 2011, 09:32
von Rekrul
Also runden willst du
Re: Alorythmus zum Stellensuchen
Verfasst: Dienstag 8. März 2011, 10:27
von EyDu
Das bisect-Modul könnte hier auch hilfreich sein.
Re: Algorythmus zum Stellensuchen
Verfasst: Dienstag 8. März 2011, 18:02
von numerix
EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Was natürlich eine Ordnung der Werte voraussetzt ...
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...
Re: Algorythmus zum Stellensuchen
Verfasst: Dienstag 8. März 2011, 18:16
von EyDu
numerix hat geschrieben:EyDu hat geschrieben:Das bisect-Modul könnte hier auch hilfreich sein.
Was natürlich eine Ordnung der Werte voraussetzt ...
Solange nicht klar ist, ob es ein Ordnung gibt oder sogar äquidistante Werte sichergestellt sind, bringen weitere Überlegungen wohl wenig. Offenbar hat der OP aber wenig Interesse an den Antworten ...
Ich gehe davon aus, dass jemand die Dokumentation zu einem Modul liest, bevor er es verwendet. Dann soll der OP selber entscheiden, ob es passt oder nicht.
Re: Algorythmus zum Stellensuchen
Verfasst: Mittwoch 9. März 2011, 09:32
von mathman
Vielen Dank für die Antworten.
Die Werte sind in dem Array geordnet.
Werde nun die Lösungen aus einander nehmen um
zu schauen wie diese funktionieren

Re: Algorythmus zum Stellensuchen
Verfasst: Mittwoch 9. März 2011, 13:54
von numerix
Wenn nun auch die Abstände - wie in dem Beispiel - immer gleich sind, kannst du den gesuchten Wert über eine direkte Berechnung ermitteln - das wäre dann am effizientesten.
Falls die Abstände nicht gleich sind, ist der Hinweis von EyDu der entscheidende.