Python:如何修复插值例程

时间:2014-12-06 14:43:47

标签: python loops

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

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,因为每个i都需要永远。有没有更好的写作方式?

2 个答案:

答案 0 :(得分:1)

是的,这就是你获得例外的原因 - j使用了错误的最大长度。你肯定需要改变:

for j in range(len(wavelength)):

for j in range(len(filterwavelength)):

人们不知道你的意思是“当我不想要它时循环”

答案 1 :(得分:1)

j范围超过wavelength,但后来将其用作filteredwavelength(最初为空)的索引。您还可以修改循环中的ij,这通常是(但并非总是)可疑的。