2015-09-04 49 views
12

我需要返回大數組中每個元素的sin和cos值。目前我在做:有沒有一種在Python中返回Sin和Cos相同值的快速方法?

a,b=np.sin(x),np.cos(x) 

其中x是一些大的數組。我需要保留每個結果的符號信息,因此:

a=np.sin(x) 
b=(1-a**2)**0.5 

不是一個選項。有沒有更快的方法來同時返回罪和cos?

+1

*罪* 90- * X * = * COS X * – tripleee

+0

難道我明白你的問題是否正確?基本上你問:如果我已經計算過'np.sin(x)',我能用這些信息來比'np.cos(x)'更快地得到'cos(x)'嗎? – cel

+6

OP是傾斜的,指的是一些數學庫(和數學硬件)有一個[sincos](http://linux.die.net/man/3/sincos)函數,它同時返回sin和cos一個給定的論點。所以,想知道numpy是否可以做到這一點並不合理,IMO。 –

回答

0

您可以利用tan(x)包含sin(x)和cos(x)函數的事實。因此,您可以使用tan(x)並使用公共轉換函數檢索cos(x)ans sin(x)。

+1

如何獲得正確的符號信息?你只是檢查哪個象限在? –

+0

非常好的一點,我忽略了這也失去了標誌信息......如果我不得不檢索角度的象限,我可以在我的原始文章中使用替代方法。問題依然存在;如何快速確定數組中所有元素的象限? – rylirk

+0

檢索標誌而失去了這個tecnique的優勢,我想 – vathek

0
def cosfromsin(x,sinx): 
    cosx=absolute((1-sinx**2)**0.5) 
    signx=sign(((x-pi/2)%(2*pi))-pi) 
    return cosx*signx 

a=sin(x) 
b=cosfromsin(x,a) 

我剛剛計時,它比使用sin和cos快25%。

+0

那你其實時間?當你計算它時,數組'x'有多大?當我預先計算'sinx'和比較'COS(X)'和'cosfromsin(X,sinx的)'的定時,'cosfromsinx'較慢。 –

+0

這就是我所做的。對象我傳遞給餘弦和cosfrom罪是2維numpy的陣列大致2000 * 1000 – rylirk

+0

這'cosfromsin(X)'的尺寸,用'的sin(x)'給出的,是慢〜4倍比'COS(X )'這裏也是這樣的數組大小(甚至更小)。注意:'絕對'可以被刪除。 'signcos =(np.int _((X - PI_2)// PI)&1)* 2 - 1'有些加快,但仍不會跳動。 – kxr

2

您可以使用複數和事實e i· φ = cos(φ)+ i·罪(φ)

import numpy as np 
from cmath import rect 
nprect = np.vectorize(rect) 

x = np.arange(2 * np.pi, step=0.01) 

c = nprect(1, x) 
a, b = c.imag, c.real 

我使用的是這裏從https://stackoverflow.com/a/27788291/674064的伎倆,使一個版本的cmath.rect()那將接受並返回NumPy的陣列。

這不會得到我的機器上的任何加速,雖然:

c = nprect(1, x) 
a, b = c.imag, c.real 

大約需要三倍的時間(160個μ s)表示

a, b = np.sin(x), np.cos(x) 

參加了我的測量(50.4 μ S)。

+1

是的,我曾嘗試類似的方法,但不幸的是它慢了很多 – rylirk

0

經由複數純numpy的版本,ê我φ = COS φ + I罪φ,通過 從das-g答案的啓發。

x = np.arange(2 * np.pi, step=0.01) 

eix = np.exp(1j*x) 
cosx, sinx = eix.real, eix.imag 

這比nprect較快,但仍比sincos電話較慢:

In [6]: timeit c = nprect(1, x); cosx, sinx = cos(x), sin(x) 
1000 loops, best of 3: 242 us per loop 

In [7]: timeit eix = np.exp(1j*x); cosx, sinx = eix.real, eix.imag 
10000 loops, best of 3: 49.1 us per loop 

In [8]: timeit cosx, sinx = cos(x), sin(x) 
10000 loops, best of 3: 32.7 us per loop 
相關問題