gpt4 book ai didi

python - 更快的numpy笛卡尔到球坐标转换?

转载 作者:IT老高 更新时间:2023-10-28 22:11:22 24 4
gpt4 key购买 nike

我有一个来自 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com