2012-06-26 2 views

risposta

8

Non hai bisogno di una libreria per un semplice gaussiano 1D.

from math import pi, sqrt, exp 

def gauss(n=11,sigma=1): 
    r = range(-int(n/2),int(n/2)+1) 
    return [1/(sigma * sqrt(2*pi)) * exp(-float(x)**2/(2*sigma**2)) for x in r] 

Nota: Questo sarà sempre tornare una strana lista di lunghezza centrato circa 0. Suppongo che ci possono essere situazioni in cui si vorrebbe un ancora di lunghezza gaussiana con valori per x = [..., -1.5, -0.5, 0.5, 1.5, ...], ma in quel caso, si avrebbe bisogno di una formula leggermente diversa e lascio che a voi;) esempio

uscita con valori di default, n = 11sigma = 1:

>>> g = gauss() 
1.48671951473e-06 
0.000133830225765 
0.00443184841194 
0.0539909665132 
0.241970724519 
0.398942280401 
0.241970724519 
0.0539909665132 
0.00443184841194 
0.000133830225765 
1.48671951473e-06 

>>> sum(g) 
0.99999999318053079 
+0

mi aspettavo restituisce qualcosa come curva Guassian dopo plt.hist (g), ma è un mezzo congettura – Moj

3

Prova scipy.ndimage.gaussian_filter, ma vuoi davvero il ker nel o vuoi anche applicarlo? (Nel qual caso puoi semplicemente usare questa funzione.) Nel primo caso, applica il filtro su un array che è 0 ovunque ma con un 1 al centro. Per il caso 1d più facile da scrivere, questo sarebbe per esempio:

>>> ndimage.gaussian_filter1d(np.float_([0,0,0,0,1,0,0,0,0]), 1) 
array([ 1.33830625e-04, 4.43186162e-03, 5.39911274e-02, 
     2.41971446e-01, 3.98943469e-01, 2.41971446e-01, 
     5.39911274e-02, 4.43186162e-03, 1.33830625e-04])