Hilfe für Anfänger

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
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

Hallo zusammen,

ich bin ein Python-/Programmierneuling und habe folgendes Problem:
Ich hab zwei arrays pt (Ort - Zeit) und st (Reiz-Zeit). Nun möchte ich den Ort eines jeden Reizes bestimmen. Dazu habe ich mir folgendes überlegt:

Code: Alles auswählen

tIndex=range(len(pt)
for i in tIndex:
     if st[k]<pt[i]:
         z=i
         break
so weit funktioniert alles, wenn ich einzelne Werte für k einsetze.
Nun ist aber mein array sehr lange und deshalb würde ich gerne eine weitere Schleife machen. Nur wie mache ich das, da mein z ja dann aus mehreren i Werten besteht??

Wär super wenn mir jem helfen könnte!
Zuletzt geändert von Anonymous am Freitag 14. Juni 2013, 17:31, insgesamt 1-mal geändert.
Grund: Code-Formatierung korrigiert
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Aus der Beschreibung ist mir nicht klar geworden was du genau möchtest. Hast du wirklich Arrays oder hast du Listen? Was steht in den Arrays/Listen in jedem einzelnen Element tatsächlich (unter (Ort - Zeit) kann ich mir nicht wirklich etwas vorstellen)? Wie ist die Beziehung zwischen pt und st?
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

Also was ich genau machen will ist folgendes:
Ich beobachte einen Menschen der 20 min durch eine Stadt (ein begrenztes Gebiet) läuft und zeichne ungefähr alle 2 Sekunden (mein pt) auf an welcher Stelle er sich genau befindet (x und y Koordinate - meine Daten px, py). Wenn er ein Wort sagt, notiere ich mir die entsprechende Zeit, zu der er ein Wort gesagt hat (mein st).

Nun will ich mir seinen Laufweg anschauen. Dies ist nicht so schwer. Dazu plotte ich nur px und py.

Wo ich allerdings ein Problem habe ist dazu noch zu schauen, an welcher Stelle er geredet hat.
Dafür hatte ich mir den Code von vorhin überlegt. Was ich z.B. für k=0 in diesem Code, den ich mir überlegt habe mache:
Ich weiß für alle Zeiten pt meinen Ort. Deshalb durchsuche ich für das erste Wort st[0] meine Daten pt. Ich schaue welcher Zeitpunkt, für den ich Ortswerte habe, der letzte vor meinem Zeitpunkt ist an dem der Mensch zum ersten Mal ein Wort spricht. Das bedeutet spricht der Mensch zum ersten mal nach 5,34 Sekunden sein erstes Wort, soll mir der Code z=1 ausgeben, wenn pt=[2,4,6,8, ...] (in Sekunden) ist. (Diese Genauigkeit bezüglich meiner Orte reicht mir zunächst). Und für einzelne Werte gelingt es mir so auch.
Wo ich jetzt allerdings ein Problem habe, ist, dass ich es nicht nur für mein erstes oder fünftes Wort haben möchte sondern für alle 1987 Wörter, die ich aufgenommen habe.

Ich hoffe, dass jetzt verständlicher ist was ich gemacht habe und was ich erreichen möchte.
BlackJack

@mathematik: Die einfachste Möglichkeit wäre es eine Funktion zu schreiben, die Orte und einen Zeitpunkt übergeben bekommt und dann den passenden Ort zum Zeitpunkt liefert. Also das was Du schon hast, in eine Funktion vepackt. Die Funktion kannst Du dann für jeden Zeitpunkt aufrufen und schon hast Du zu jedem Zeitpunkt den Ort.

Das ist von der Laufzeit her, so wie Du das jetzt machst, natürlich ungünstig, weil im schlechtesten Fall `O(|st|·|pt|)` mal Elemente verglichen werden. Wenn man davon ausgeht, dass die Orte zeitlich aufsteigend sortiert sind, kann man statt linear zu suchen, natürlich auch eine Intervallschachtelung verwenden. Das muss man sich nicht einmal selber programmieren, denn dafür gibt es schon etwas in der Standardbibliothek: das `bisect`-Modul. Wenn auch die Zeitpunkte aufsteigend sortiert sind, kann man den letzten Treffer zusätzlich nutzen um den Suchbereich einzuschränken. Das müssten dann `O(|st|·log(|pt|))` Elementvergleiche sein.

Falls das immer noch zu ineffizient sein sollte und beide Sequenzen zeitlich aufsteigend sortiert sind, kann man etwas ähnliches wie Mergesort schreiben um den Zeitpunkten Orte zuzuordnen. Da wäre man dann bei `O(max(|st|, |pt|))`.
Antworten