Pour terminer les réponses précédentes, voici une mise en œuvre Numexpr (avec une solution de repli possible 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
Pour les grandes tailles de tableau, cela permet un facteur de 2 vitesses en hausse par rapport à pur une mise en œuvre Numpy , et serait comparable aux vitesses C ou Cython. La solution numpy présente (lorsqu'il est utilisé avec l'argument ceval=eval
) est 25% plus rapide que la fonction appendSpherical_np
dans la @mtrw réponse pour les grandes tailles de tableau,
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
bien pour les petites tailles, appendSpherical_np
est plus rapide,
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
Excellent travail, ma solution Cython est seulement un peu plus rapide (1,23 secondes contre 1,54 secondes sur ma machine). Pour une raison quelconque, je n'ai pas vu la fonction vectorisée arctan2 quand j'ai cherché à le faire directement avec numpy. +1 –
Anon suggéré 'ptsnew [:, 4] = np.arctan2 (np.sqrt (xy), xyz [:, 2])' –
voir: http://stackoverflow.com/edit-suggestions/756 –