这类似于贾斯汀·皮尔 https://stackoverflow.com/questions/4116658/faster-numpy-cartesian-to-spherical-coordinate-conversion/4116803#4116803的答案,但仅使用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,所以我无法将时间与该解决方案进行比较。