2016-09-26 49 views
0

我正在写一个脚本,它读入一个文件,其中包含文件列表并在这些文件上执行高斯拟合。这些文件中的每一个都由两列组成(wv和flux在下面的脚本中)。我的小问题是如何限制基于“wv”值的范围?我尝试过使用“for”循环,但是我得到了与fit相关的错误(如果我不限制“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循环中的变量更改为其他内容)。