Schnelleres Umschalten von kartesisch auf sphärische Koordinaten?
Ich habe ein array von 3 Millionen Datenpunkte aus einem 3-axiz accellerometer (XYZ), und ich möchte hinzufügen 3 Spalten array mit den äquivalenten sphärischen Koordinaten (r, theta, phi). Der folgende code funktioniert, scheint aber viel zu langsam. Wie kann ich besser machen?
import numpy as np
import math as m
def cart2sph(x,y,z):
XsqPlusYsq = x**2 + y**2
r = m.sqrt(XsqPlusYsq + z**2) # r
elev = m.atan2(z,m.sqrt(XsqPlusYsq)) # theta
az = m.atan2(y,x) # phi
return r, elev, az
def cart2sphA(pts):
return np.array([cart2sph(x,y,z) for x,y,z in pts])
def appendSpherical(xyz):
np.hstack((xyz, cart2sphA(xyz)))
InformationsquelleAutor der Frage BobC | 2010-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ähnlich zu Justin Peel's Antwort, aber mit nur
numpy
und die Vorteile der integrierten-in-Vektorisierung:Beachten Sie, dass, wie vorgeschlagen, in die Kommentare, ich habe verändert die definition der Neigungswinkel von Ihrer ursprünglichen Funktion. Auf meinem Rechner testen mit
pts = np.random.rand(3000000, 3)
die Zeit ging von 76 Sekunden auf 3,3 Sekunden. Ich habe nicht Cython so war ich nicht in der Lage zu vergleichen, die timing mit dieser Lösung.InformationsquelleAutor der Antwort mtrw
Hier ist eine schnelle Cython-code, den ich schrieb:
Er nahm die Zeit von 62,4 Sekunden 1,22 Sekunden mit 3,000,000 Punkte für mich. Das ist nicht zu schäbig. Ich bin sicher, es gibt einige andere Verbesserungen, die gemacht werden können.
InformationsquelleAutor der Antwort Justin Peel
Die vorherigen Antworten, hier ist ein Numexpr Umsetzung (mit einer möglichen fallback auf Numpy),
Für große array-Größen, dies ermöglicht einen Faktor 2 beschleunigen, im Vergleich zur reinen ein Numpy-Implementierung, und wäre vergleichbar mit C oder Cython-Geschwindigkeiten. Die vorliegende numpy-Lösung (bei Verwendung des
ceval=eval
- argument) ist auch 25% schneller als dieappendSpherical_np
Funktion in der @mtrw Antwort für große array-Größen,obwohl für die kleineren Größen,
appendSpherical_np
ist tatsächlich schneller,InformationsquelleAutor der Antwort rth
! Es ist ein Fehler noch in den code oben.. und das ist ein top-Google-Ergebnis..
TLDR:
Ich habe getestet, mit VPython, mit atan2 für theta (elev) falsch ist, verwenden Sie
acos! Es ist korrekt für phi (azim).
Ich empfehle die sympy1.0 acos-Funktion (es muss nicht einmal beschweren sich über acos(z/r) mit r = 0 ) .
http://mathworld.wolfram.com/SphericalCoordinates.html
Wenn wir zu konvertieren, dass auf die Physik-system (r, theta, phi) = (r, Höhe, Azimut) wir haben:
Nicht optimiert, sondern richtige code für Rechtshänder-Physik-system:
können Sie es selbst testen mit einer Funktion wie:
einige andere test-Daten für einige Quadranten:
Ich verwendet VPython zusätzlich zu einfaches visualisieren von Vektoren:
InformationsquelleAutor der Antwort Vincent