Faster numpy cartesian to spherical coordinate conversion?

前端 未结 5 1569
南旧
南旧 2020-12-04 15:57

I have an array of 3 million data points from a 3-axiz accellerometer (XYZ), and I want to add 3 columns to the array containing the equivalent spherical coordinates (r, the

5条回答
  •  情深已故
    2020-12-04 16:16

    ! There is an error still in all the code above.. and this is a top Google result.. TLDR: I have tested this with VPython, using atan2 for theta (elev) is wrong, use acos! It is correct for phi (azim). I recommend the sympy1.0 acos function (it does not even complain about acos(z/r) with r = 0 ) .

    http://mathworld.wolfram.com/SphericalCoordinates.html

    If we convert that to the physics system (r, theta, phi) = (r, elev, azimuth) we have:

    r = sqrt(x*x + y*y + z*z)
    phi = atan2(y,x)
    theta = acos(z,r)
    

    Non optimized but correct code for right-handed physics system:

    from sympy import *
    def asCartesian(rthetaphi):
        #takes list rthetaphi (single coord)
        r       = rthetaphi[0]
        theta   = rthetaphi[1]* pi/180 # to radian
        phi     = rthetaphi[2]* pi/180
        x = r * sin( theta ) * cos( phi )
        y = r * sin( theta ) * sin( phi )
        z = r * cos( theta )
        return [x,y,z]
    
    def asSpherical(xyz):
        #takes list xyz (single coord)
        x       = xyz[0]
        y       = xyz[1]
        z       = xyz[2]
        r       =  sqrt(x*x + y*y + z*z)
        theta   =  acos(z/r)*180/ pi #to degrees
        phi     =  atan2(y,x)*180/ pi
        return [r,theta,phi]
    

    you can test it yourself with a function like:

    test = asCartesian(asSpherical([-2.13091326,-0.0058279,0.83697319]))
    

    some other test data for some quadrants:

    [[ 0.          0.          0.        ]
     [-2.13091326 -0.0058279   0.83697319]
     [ 1.82172775  1.15959835  1.09232283]
     [ 1.47554111 -0.14483833 -1.80804324]
     [-1.13940573 -1.45129967 -1.30132008]
     [ 0.33530045 -1.47780466  1.6384716 ]
     [-0.51094007  1.80408573 -2.12652707]]
    

    I used VPython additionally to easily visualize vectors:

    test   = v.arrow(pos = (0,0,0), axis = vis_ori_ALA , shaftwidth=0.05, color=v.color.red)
    

提交回复
热议问题