Seite 1 von 1

Vektorlänge errechen??

Verfasst: Freitag 28. September 2007, 13:55
von tjuXx
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

Verfasst: Freitag 28. September 2007, 14:02
von Rebecca
"Einen Vektor" gibt es in Python ja erstmal nicht. Von was fuer einem Datentyp redest du? Listen, Tupel, irgendwas numpy-maessiges?

Verfasst: Freitag 28. September 2007, 14:15
von tjuXx
Ich rede von einer Liste.

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))
Es gibt dafür doch betimmt auch ein Modul???

Verfasst: Freitag 28. September 2007, 14:26
von mawe
tjuXx hat geschrieben:Es gibt dafür doch betimmt auch ein Modul???
Deine "von Hand" Lösung funktioniert doch eh, wofür ein Modul? Aber wenn du willst schau dir doch mal numpy an.
Oder:

Code: Alles auswählen

vlen = sqrt(sum([x**2 for x in vecXYZ]))

Verfasst: Freitag 28. September 2007, 14:45
von CM
Mit numpy auch

Code: Alles auswählen

vlen = sqrt(sum(vecXYZ**2))
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

Verfasst: Freitag 28. September 2007, 14:54
von tjuXx
Erstmal vielen Dank für die Hilfe...
mawe hat geschrieben:Deine "von Hand" Lösung funktioniert doch eh, wofür ein Modul?
Ich habe erst vor zwei Wochen mit python angefangen, und will die Module ein bisschen kennenlernen.

...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. :wink:

Verfasst: Freitag 28. September 2007, 15:02
von Rebecca
Ich finde mawes Loesung zwar schoener, aber so geht's auch:

Code: Alles auswählen

vlen = sqrt(sum(map(lambda x: x**2, vecXYZ)))
:twisted:

Verfasst: Freitag 28. September 2007, 15:05
von CM
Obfuscating enhanced??? :D

Verfasst: Freitag 28. September 2007, 15:59
von BlackJack
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. :-)

Verfasst: Freitag 28. September 2007, 16:21
von CM
SNCR - hat mich jetzt nicht loslassen können:

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()
erzeugt bei mir folgende Ausgabe:
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
Für einen Default von 1e6 Aufrufen.
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