Hi,
ich brauche eine Funktion mit der ich die Länge von einem Vektor berrechnen kann.
Kennt jemand ein Modul dafür oder muss es es "von Hand" errechnen??
Gruß TjuXx
Vektorlänge errechen??
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
"Einen Vektor" gibt es in Python ja erstmal nicht. Von was fuer einem Datentyp redest du? Listen, Tupel, irgendwas numpy-maessiges?
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- tjuXx
- User
- Beiträge: 67
- Registriert: Freitag 21. September 2007, 09:25
- Wohnort: Bremerhaven
- Kontaktdaten:
Ich rede von einer Liste.
vecXYZ = [20,20,20]
habe es "von Hand" wie folgt gelößt:
Es gibt dafür doch betimmt auch ein Modul???
vecXYZ = [20,20,20]
habe es "von Hand" wie folgt gelößt:
Code: Alles auswählen
vecXYZ = [20,20,20]
vlen = sqrt((vecXYZ[0]**2)+(vecXYZ[1]**2)+(vecXYZ[2]**2))
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Deine "von Hand" Lösung funktioniert doch eh, wofür ein Modul? Aber wenn du willst schau dir doch mal numpy an.tjuXx hat geschrieben:Es gibt dafür doch betimmt auch ein Modul???
Oder:
Code: Alles auswählen
vlen = sqrt(sum([x**2 for x in vecXYZ]))
Mit numpy auch
vorausgesetzt vecXYZ ist ein numpy.array. Etwas schneller ist auf das ** zu verzichten und vecXZY * vecXZY zu schreiben. (Fällt ab bei einigen Millionen dieser "Vektoren" ins Gewicht
. Einen Benchmark habe ich nicht gemacht, aber mein aktuelles Projekt verwendet solchen Code.)
Solltest Du diese Rechnung sehr häufig durchführen (Beispielsweise in einer langen Schleife über Vektoren), dann ist der numpy-Code in der Tat schneller.
Gruß,
Christian
Code: Alles auswählen
vlen = sqrt(sum(vecXYZ**2))

Solltest Du diese Rechnung sehr häufig durchführen (Beispielsweise in einer langen Schleife über Vektoren), dann ist der numpy-Code in der Tat schneller.
Gruß,
Christian
- tjuXx
- User
- Beiträge: 67
- Registriert: Freitag 21. September 2007, 09:25
- Wohnort: Bremerhaven
- Kontaktdaten:
Erstmal vielen Dank für die Hilfe...
...wie ich sehe lässt sich die Länge meines Codes ja noch halbieren. Und ich habe eigenlich an meinen Code auch den anspruch das er nicht nur funktioniert, sondern auch übersichtlich, spirch kurz genau ist.
Ich habe erst vor zwei Wochen mit python angefangen, und will die Module ein bisschen kennenlernen.mawe hat geschrieben:Deine "von Hand" Lösung funktioniert doch eh, wofür ein Modul?
...wie ich sehe lässt sich die Länge meines Codes ja noch halbieren. Und ich habe eigenlich an meinen Code auch den anspruch das er nicht nur funktioniert, sondern auch übersichtlich, spirch kurz genau ist.

- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Ich finde mawes Loesung zwar schoener, aber so geht's auch:

Code: Alles auswählen
vlen = sqrt(sum(map(lambda x: x**2, vecXYZ)))

Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Obfuscating enhanced??? 

Bei aktuellen Python-Versionen würde ich bei mawe's Lösung noch die eckigen Klammern weglassen und bei Rebecca's `itertools.imap()` statt `map()` verwenden. Die Liste als Zwischenergebnis braucht man ja nicht unbedingt. 

SNCR - hat mich jetzt nicht loslassen können:
Folgender - quick & dirty - Code:
erzeugt bei mir folgende Ausgabe:
Version 5 kann man so nicht berechnen, weil timeit das nicht mitmacht, aber ich habe eine Verabredung und muß los ...
Das Ergebnis überrascht mich insofern, als das ich glaubte alles in den letzten Wochen durchprobiert zu haben ...
Also mawe / BJ, der Punkt geht an Euch.
Allerdings habe ich eine Version in Pyrex, die etwa genauso schnell ist für 13-14-fache Zahl der Iterationen.
Gruß & schönes WE,
Christian
Folgender - quick & dirty - Code:
Code: Alles auswählen
import timeit
from numpy import *
from itertools import imap
vec = array([10, 10, 10.0])
def ver1():
sqrt(sum([x**2 for x in vec]))
def ver2():
sqrt(sum(vec**2))
def ver3():
sqrt(sum(vec * vec))
def ver4():
sqrt(sum(map(lambda x: x**2, vec)))
def ver5():
sqrt(sum(imap(lambda x: x**2, vec)))
def ver6():
sqrt(sum(x**2 for x in vec))
t1 = timeit.Timer("ver1()", "from __main__ import ver1")
print "ver1 dauert: %f sec" % t1.timeit()
t2 = timeit.Timer("ver2()", "from __main__ import ver2")
print "ver2 dauert: %f sec" % t2.timeit()
t3 = timeit.Timer("ver3()", "from __main__ import ver3")
print "ver3 dauert: %f sec" % t3.timeit()
t4 = timeit.Timer("ver4()", "from __main__ import ver4")
print "ver4 dauert: %f sec" % t4.timeit()
t6 = timeit.Timer("ver6()", "from __main__ import ver6")
print "ver6 dauert: %f sec" % t6.timeit()
Für einen Default von 1e6 Aufrufen.ver1 dauert: 70.053207 sec
ver2 dauert: 27.043796 sec
ver3 dauert: 27.745168 sec
ver4 dauert: 71.006399 sec
ver6 dauert: 25.752228 sec
Version 5 kann man so nicht berechnen, weil timeit das nicht mitmacht, aber ich habe eine Verabredung und muß los ...
Das Ergebnis überrascht mich insofern, als das ich glaubte alles in den letzten Wochen durchprobiert zu haben ...
Also mawe / BJ, der Punkt geht an Euch.
Allerdings habe ich eine Version in Pyrex, die etwa genauso schnell ist für 13-14-fache Zahl der Iterationen.

Gruß & schönes WE,
Christian