我有一个3轴加速度计(XYZ)的300万个数据点的数组,我想在包含等效球坐标(r,theta,phi)的数组中添加3列。下面的代码可以工作,但似乎太慢了。我怎样才能做得更好?
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)))
这类似于Justin Peel的答案,但只使用
numpy
并利用其内置矢量化:请注意,如注释中所建议的,我已经从原来的函数更改了仰角的定义。在我的机器上,用
pts = np.random.rand(3000000, 3)
测试时,时间从76秒变为3.3秒。我没有Cython,所以无法将时间与解决方案进行比较。下面是我为这个写的一个简单的Cython代码:
我花了300万分从62.4秒降到1.22秒。那不算太寒酸。我相信还有其他的改进可以做。
啊!上面所有代码中仍有错误。。这是一个顶级的谷歌结果。。 TLDR编号: 我已经用VPython测试过了,用atan2表示theta(elev)是错误的,用 阿科斯!对phi(azim)来说是正确的。 我推荐sympy1.0acos函数(它甚至不抱怨r=0的acos(z/r))。
http://mathworld.wolfram.com/SphericalCoordinates.html
如果我们把它转换成物理系统(r,θ,phi)=(r,elev,方位角),我们得到:
非优化但正确的右手物理系统代码:
您可以使用以下函数自己测试它:
一些象限的其他测试数据:
我还使用了VPython来方便地可视化矢量:
相关问题 更多 >
编程相关推荐