2013-11-21 18 views
6

Có cách nào hiệu quả để thay đổi giữa hệ tọa độ Descartes và n-spherical one không? Việc chuyển đổi như sau: enter image description herehệ tọa độ n-sphere với hệ tọa độ Cartesian

Sau đây là mã của tôi nhưng tôi muốn để thoát khỏi vòng lặp:

import numpy as np 
import scipy.sparse 

    def coord_transform_n(r,alpha): 
     """alpha: the n-2 values between [0,\pi) and last one between [0,2\pi) 
     """ 
     x=[] 
     for i in range(alpha.shape[0]): 
      x.append(r*np.prod(np.sin(alpha[0:i]))*np.cos(alpha[i])) 
     return np.asarray(x) 
    print coord_transform_n(1,np.asarray(np.asarray([1,2]))) 
+0

tôi nhận ra mã của tôi là không đúng. Tôi không bao gồm tọa độ cuối cùng, cụ thể là x_n! – Cupitor

Trả lời

6

mã ban đầu của bạn có thể được đẩy nhanh với ghi nhớ trung gian sản phẩm sin, ví dụ:

def ct_dynamic(r, alpha): 
    """alpha: the n-2 values between [0,\pi) and last one between [0,2\pi) 
    """ 
    x = np.zeros(len(alpha) + 1) 
    s = 1 
    for e, a in enumerate(alpha): 
     x[e] = s*np.cos(a) 
     s *= np.sin(a) 
    x[len(alpha)] = s 
    return x*r 

Nhưng vẫn thua về tốc độ để NumPy cách tiếp cận dựa

def ct(r, arr): 
    a = np.concatenate((np.array([2*np.pi]), arr)) 
    si = np.sin(a) 
    si[0] = 1 
    si = np.cumprod(si) 
    co = np.cos(a) 
    co = np.roll(co, -1) 
    return si*co*r 

>>> n = 10 
>>> c = np.random.random_sample(n)*np.pi 
>>> all(ct(1,c) == ct_dynamic(1,c)) 
True 

>>> timeit.timeit('from __main__ import coord_transform_n as f, c; f(2.4,c)', number=10000) 
2.213547945022583 

>>> timeit.timeit('from __main__ import ct_dynamic as f, c; f(2.4,c)', number=10000) 
0.9227950572967529 

>>> timeit.timeit('from __main__ import ct as f, c; f(2.4,c)', number=10000) 
0.5197498798370361 
+0

Cảm ơn bạn rất nhiều. Tôi nhận ra mã của tôi là không chính xác. Tôi không bao gồm tọa độ cuối cùng, cụ thể là x_n! – Cupitor

+0

@Naji nó không khó để sửa chữa nó, tất cả các đánh giá đã được thực hiện. Tôi đã cập nhật câu trả lời của tôi để thực hiện đúng, để lại cho bạn;) – alko

+1

Vâng tôi đã làm. Tôi chỉ cho bạn biết: D – Cupitor

4

Đề nghị của tôi: Lắp ráp các xoang trong một vector, sử dụng cumprod vào nó, sau đó multply mỗi một với cosinus của nó.

Các vấn đề liên quan