Algorythmus zum Stellensuchen

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
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

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ß
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

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
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

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?
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

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.
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

Also runden willst du :wink:

Code: Alles auswählen

>>> round(0.6/0.25)
2.0
>>> round(0.63/0.25)
3.0
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das bisect-Modul könnte hier auch hilfreich sein.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

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 :)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Antworten