更快的numpy直角坐标到球坐标的转换? [英] Faster numpy cartesian to spherical coordinate conversion?
问题描述
我有一个来自3轴加速度计(XYZ)的300万个数据点的数组,我想向该数组添加3列,其中包含等效的球坐标(r,theta,phi).以下代码有效,但似乎太慢了.我该怎么做?
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, theta, phi). The following code works, but seems way too slow. How can I do better?
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)))
推荐答案
This is similar to Justin Peel's answer, but using just numpy
and taking advantage of its built-in vectorization:
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,因此无法将计时与该解决方案进行比较.
Note that, as suggested in the comments, I've changed the definition of elevation angle from your original function. On my machine, testing with pts = np.random.rand(3000000, 3)
, the time went from 76 seconds to 3.3 seconds. I don't have Cython so I wasn't able to compare the timing with that solution.
这篇关于更快的numpy直角坐标到球坐标的转换?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!