2017-06-02 2 views
0

Der IDL-Code, den ich in Python schreiben möchte, berechnet ein Hintergrundrauschen aus einer Reihe von Werten in Abhängigkeit von seiner Standardabweichung. Hier ist der Code:IDL-Code in Python übersetzen

; (INPUT) 
; data = 1-D array of intensities 
; (OUTPUT) 
; bck,sig = background and fluctuations (1 sig level) 
; ndata = number of values upon which bck,sig are computed 
; POSITIVE = retains only data values > 0 
; NSIG = number of sigmas 

    if not(keyword_set(NSIG)) then nsig=3.  
    if keyword_set(POSITIVE) then begin 
    test=where(data gt 0.) 
    if test(0) ne -1 then data2=data(test) else begin 
     bck=0 & sig=-1 & ndata=0 & goto,out 
    endelse 
    endif else data2=data 
    if n_elements(data2) gt 1 then begin 
    bck=mean(data2,/double) & sig=stddev(data2,/double) 
    endif else begin 
    bck=data2(0) & sig=0 & ndata=1 & goto,out 
    endelse 
    ndata=1 

loop: 
    test=where(abs(data2-bck) lt nsig*sig) 
    if n_elements(test) eq 1 then goto,out 
    ndata=n_elements(test) 
    moy=mean(data2(test),/double) 
    sig=stddev(data2(test),/double) 
    if moy eq bck then goto,out 
    bck=moy 
    goto,loop 

out: 
    return 
end 

Das Herz des Codes wird die Schleife, und hier ist mein Versuch, es zu wiederholen:

def bg(array): 
    temp = [] 
    for i in range(len(array)): 
     if array[i]-np.mean(array) < 3*np.std(array): 
      temp.append(array[i]) 
    avg=mean(temp) 
    return avg 

Ist das richtig? Findet der Originalcode nur den Mittelwert der Werte, die unter 3 * Std liegen?

Was bedeutet die 1 in dieser Zeile eigentlich? if n_elements(test) eq 1 then goto,out

Antwort

0

Es sieht so aus, als ob das der Code tut. Es berechnet nur den Mittelwert der Punkte, die unter nsig liegen.

if n_elements(test) eq 1 then goto,out sagt, dass, wenn es nur ein Element im Test gibt, gehen Sie zu der out Zeile, die dann eine Rückkehr ausführen wird.

Im Allgemeinen sollten goto Anweisungen in IDL vermieden werden, sie haben eine Tendenz, den Code sehr chaotisch und schwer zu debuggen.