要完成以前的答案,這裏是一個Numexpr實現(具有可能的回退到numpy的),
import numpy as np
from numpy import arctan2, sqrt
import numexpr as ne
def cart2sph(x,y,z, ceval=ne.evaluate):
""" x, y, z : ndarray coordinates
ceval: backend to use:
- eval : pure Numpy
- numexpr.evaluate: Numexpr """
azimuth = ceval('arctan2(y,x)')
xy2 = ceval('x**2 + y**2')
elevation = ceval('arctan2(z, sqrt(xy2))')
r = eval('sqrt(xy2 + z**2)')
return azimuth, elevation, r
對於大型陣列的尺寸,這允許相對於純一個numpy的實施2速度的一個因素,並且可以與C或Cython速度相媲美。本numpy的溶液(與ceval=eval
參數使用時)也比在@mtrw答案爲大陣列尺寸的appendSpherical_np
功能快25%,
In [1]: xyz = np.random.rand(3000000,3)
...: x,y,z = xyz.T
In [2]: %timeit -n 1 appendSpherical_np(xyz)
1 loops, best of 3: 397 ms per loop
In [3]: %timeit -n 1 cart2sph(x,y,z, ceval=eval)
1 loops, best of 3: 280 ms per loop
In [4]: %timeit -n 1 cart2sph(x,y,z, ceval=ne.evaluate)
1 loops, best of 3: 145 ms per loop
儘管對於更小的尺寸,appendSpherical_np
實際上更快,
In [5]: xyz = np.random.rand(3000,3)
...: x,y,z = xyz.T
In [6]: %timeit -n 1 appendSpherical_np(xyz)
1 loops, best of 3: 206 µs per loop
In [7]: %timeit -n 1 cart2sph(x,y,z, ceval=eval)
1 loops, best of 3: 261 µs per loop
In [8]: %timeit -n 1 cart2sph(x,y,z, ceval=ne.evaluate)
1 loops, best of 3: 271 µs per loop
偉大的工作,我的Cython解決方案只有一點點快(我的機器上1.23秒比1.54秒)。出於某種原因,當我尋找直接用numpy做的時候,我沒有看到矢量化的arctan2函數。 +1 – 2010-11-07 15:41:29
Anon建議'ptsnew [:,4] = np.arctan2(np.sqrt(xy),xyz [:,2])' – 2011-01-27 22:27:43
參見:http://stackoverflow.com/edit-suggestions/756 – 2011-01-27 22:28:56