擅长:python、mysql、java
<p>这类似于<a href="https://stackoverflow.com/questions/4116658/faster-numpy-cartesian-to-spherical-coordinate-conversion/4116803#4116803">Justin Peel</a>的答案,但只使用<code>numpy</code>并利用其内置矢量化:</p>
<pre><code>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
</code></pre>
<p>请注意,如注释中所建议的,我已经从原来的函数更改了仰角的定义。在我的机器上,用<code>pts = np.random.rand(3000000, 3)</code>测试时,时间从76秒变为3.3秒。我没有Cython,所以无法将时间与解决方案进行比较。</p>