2014-12-06 24 views
0

我正在尝试编写一段代码来将过滤器应用于数据集。该滤波器有两个关键位数据,波长和吞吐量。数据文件还有两个关键的数据位,波长和通量。不幸的是,过滤器文件和数据文件中的波长并不总是匹配。下面的代码旨在使用y=mx+c在数据点之间进行插值,因此获得通过滤波器的通量的近似值,其波长不等于滤波器文件中的波长。Python:如何修复插值例程

def openfilterfile(filterfile): 
    throughput=[] 
    filterwavelength=[] 
    text_file2 = open(filterfile, "r") 
    lines2 = text_file2.read() 
    #print lines2 
    text_file2.close() 
    b = [float(y) for y in lines2.split()] 
    b1=0 
    b2=1 
    while b1<len(b): 
     filterwavelength.append(b[b1]) 
     throughput.append(b[b2]) 
     b1+=2 
     b2+=2 
    print len(filterwavelength), len(throughput) 
    f=scipy.interpolate.interp1d(filterwavelength, throughput, kind='linear') 
    xnew = filterwavelength 
    ynew = f(xnew) 
    pylab.plot(filterwavelength, throughput, xnew, ynew) 
    pylab.xlim(0, 25000) 
    pylab.show() 
    return filterwavelength, throughput 

def accountforfilter(wavelength, flux, filterwavelength, throughput): 

    filteredwavelength=[] 
    filteredflux=[] 

    for i in range(len(wavelength)): 
     for j in range(len(wavelength)): 
      if wavelength[i]==filterwavelength[j]: 
       j=filterwavelength.index(wavelength[i]) 
       filteredwavelength.append(wavelength[i]) 
       filteredflux.append(flux[i]*throughput[j]) 
      elif wavelength[i]<filterwavelength[j]<wavelength[i+1]: 
       filteredwavelength.append(wavelength[i]) 
       filteredflux.append(flux[i]*f(wavelength[i])) 
      elif wavelength[i]<filterwavelength[j]: 
       i+=1 
      elif wavelength[i]>filterwavelength[j+1]: 
       j+=1 

return filteredwavelength, filteredflux 

当我运行它,我得到错误信息:

Traceback (most recent call last): 
    File "C:\Python27\05.12.2014.py", line 103, in <module> 
    filteredwavelength, filteredflux = accountforfilter(wavelength, flux, filterwavelength, throughput) 
    File "C:\Python27\05.12.2014.py", line 87, in accountforfilter 
    if wavelength[i]==filterwavelength[j]: 
IndexError: list index out of range 

如果我改变它,这样j是在range(filterwavelength),然后程序继续运行,但我认为这是遍历每个我的所有j,永远都是。有没有更好的写作方式?

回答

1

是的,这就是为什么你会得到异常 - j正在使用错误的最大长度。你一定要改变:

for j in range(len(wavelength)):

for j in range(len(filterwavelength)):

人不知道你所说的“循环的时候,我不希望它成为”

1

的意思你有j范围超过wavelength,但随后将其用作filteredwavelength(最初为空)的索引。您还在通常(但不总是)怀疑的循环内修改ij