我需要返回大數組中每個元素的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?
我需要返回大數組中每個元素的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?
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%。
那你其實時間?當你計算它時,數組'x'有多大?當我預先計算'sinx'和比較'COS(X)'和'cosfromsin(X,sinx的)'的定時,'cosfromsinx'較慢。 –
這就是我所做的。對象我傳遞給餘弦和cosfrom罪是2維numpy的陣列大致2000 * 1000 – rylirk
這'cosfromsin(X)'的尺寸,用'的sin(x)'給出的,是慢〜4倍比'COS(X )'這裏也是這樣的數組大小(甚至更小)。注意:'絕對'可以被刪除。 'signcos =(np.int _((X - PI_2)// PI)&1)* 2 - 1'有些加快,但仍不會跳動。 – kxr
您可以使用複數和事實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)。
是的,我曾嘗試類似的方法,但不幸的是它慢了很多 – rylirk
經由複數純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
較快,但仍比sin
和cos
電話較慢:
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
*罪* 90- * X * = * COS X * – tripleee
難道我明白你的問題是否正確?基本上你問:如果我已經計算過'np.sin(x)',我能用這些信息來比'np.cos(x)'更快地得到'cos(x)'嗎? – cel
OP是傾斜的,指的是一些數學庫(和數學硬件)有一個[sincos](http://linux.die.net/man/3/sincos)函數,它同時返回sin和cos一個給定的論點。所以,想知道numpy是否可以做到這一點並不合理,IMO。 –