作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个来自 3 轴加速度计 (XYZ) 的 300 万个数据点的数组,我想将 3 列添加到包含等效球坐标 (r、theta、phi) 的数组中。以下代码有效,但似乎太慢了。我怎样才能做得更好?
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
并利用其内置的矢量化:
import numpy as np
def appendSpherical_np(xyz):
ptsnew = np.hstack((xyz, np.zeros(xyz.shape)))
xy = xyz[:,0]**2 + xyz[:,1]**2
ptsnew[:,3] = np.sqrt(xy + xyz[:,2]**2)
ptsnew[:,4] = np.arctan2(np.sqrt(xy), xyz[:,2]) # for elevation angle defined from Z-axis down
#ptsnew[:,4] = np.arctan2(xyz[:,2], np.sqrt(xy)) # for elevation angle defined from XY-plane up
ptsnew[:,5] = np.arctan2(xyz[:,1], xyz[:,0])
return ptsnew
请注意,正如评论中所建议的,我已经更改了仰角的定义,而不是您原来的函数。在我的机器上,使用 pts = np.random.rand(3000000, 3)
进行测试,时间从 76 秒变为 3.3 秒。我没有 Cython,因此无法将时间与该解决方案进行比较。
关于python - 更快的numpy笛卡尔到球坐标转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4116658/
我是一名优秀的程序员,十分优秀!