Vektorlänge errechen??

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
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

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
Benutzeravatar
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
Benutzeravatar
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:

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???
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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]))
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
tjuXx
User
Beiträge: 67
Registriert: Freitag 21. September 2007, 09:25
Wohnort: Bremerhaven
Kontaktdaten:

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:
Benutzeravatar
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)))
:twisted:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Obfuscating enhanced??? :D
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. :-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten