Để hoàn thành các câu trả lời trước, đây là một thực hiện Numexpr (với một fallback thể 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
Đối với kích thước mảng lớn, điều này cho phép hệ số 2 tốc độ lên so với thực hiện NumPy tinh khiết và có thể so sánh với tốc độ C hoặc Cython. Các giải pháp NumPy hiện nay (khi được sử dụng với đối số ceval=eval
) cũng là nhanh hơn so với appendSpherical_np
chức năng trong câu trả lời @mtrw Đối với kích thước mảng lớn 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
mặc dù đối với kích thước nhỏ hơn, appendSpherical_np
là thực sự nhanh hơn,
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
Công việc tuyệt vời, giải pháp Cython của tôi chỉ nhanh hơn một chút (1.23 giây so với 1.54 giây trên máy của tôi). Vì một lý do nào đó, tôi không thấy hàm arctan2 được vector hóa khi tôi tìm kiếm nó làm thẳng với vón cục. +1 –
Anon đề xuất 'ptsnew [:, 4] = np.arctan2 (np.sqrt (xy), xyz [:, 2])' –
xem: http://stackoverflow.com/edit-suggestions/756 –