2016-09-26 6 views
0

ファイルのリストを含む1つのファイルを読み込んで、それぞれのファイルにガウス関数を適用するスクリプトを作成しています。これらのファイルはそれぞれ2つの列(以下のスクリプトではwvとflux)で構成されています。私の小さな問題は、範囲ベースの "wv"値をどのように制限するのですか?私はこれに対して "for"ループを使用しようとしましたが、フィットに関連するエラーが発生します(これは "wv"の範囲を制限しないと得られません)。Pythonは特定の列範囲のファイルを読み込みます

import numpy as np 
from scipy.optimize import curve_fit 
import matplotlib.pyplot as plt 


fits = [] 
wvi_b = [] 
wvi_r = [] 

p = open("file_input.txt","r") 
for line in p: 
    fits.append(str(line.split()[0])) 
    wvi_b.append(float(line.split()[1])) 
    wvi_r.append(float(line.split()[2])) 
p.close() 

for j in range(len(fits)): 
    wv = [] 
    flux = [] 
    f = open("%s"%(fits[j]),"r") 
    for line in f: 
     wv.append(float(line.split()[0])) 
     flux.append(float(line.split()[1])) 
    f.close() 

    def gauss(x,a,b,c,a1,b1,c1,d): 
     func = a*np.exp(-((x-b)**2)/(2.0*(c)**2)) + a1*np.exp(-((x-b1)**2)/(2.0*(c1)**2))+d 
     return func 

    for wv in range(6450, 6575): 
     guess=(0.8,wvi_b[j],3.0,1.0,wvi_r[j],3.0,1.0) 
     popt,pconv=curve_fit(gauss,wv,flux,guess) 
     print popt[1], popt[4] 
     ymod=gauss(wv,*popt) 
     plt.plot(wv,ymod) 
     plt.plot(wv,flux,marker='.') 
     plt.show() 

答えて

0

あなたがfor wv in range(6450, 6575)を呼び出し、wvは、その範囲内だけで整数ではなく、リストのメンバーです。私はあなたがその変数をどのように使っているかを見てみようと思います。 list wvのデータにアクセスするには、構文をwv[wv]に更新する必要があります(これはちょっと混乱します)。forループ内の変数を別のものに変更することが最善の方法です。

関連する問題