2017-06-02 15 views
0

私がPythonで記述しようとしているIDLコードは、標準偏差の関数で一連の値からバックグラウンドノイズを計算します。ここでは、コードです:IDLコードをPythonに翻訳する

; (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 

コードの心はループであり、ここではそれを複製する私の試みです:

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 

は、この正しいですか?元のコードは、3 * std以下の値の平均値しか見つけられませんか?

この行の1は実際には何を意味していますか? if n_elements(test) eq 1 then goto,out

答えて

0

これは、コードが実行しているようです。それはnsigの下にあるポイントの平均しか計算しません。

if n_elements(test) eq 1 then goto,outは、テストで要素が1つしかない場合は、out行に戻り、リターンを実行します。

一般的に、IDLではgotoのステートメントは避けるべきです。コードを非常に乱雑にしてデバッグする傾向があります。

関連する問題