我正在尝试编写一段代码来将过滤器应用于数据集。滤波器有两个关键位数据,波长和吞吐量。数据文件还有两个关键的数据位,波长和通量。不幸的是,过滤器文件和数据文件中的波长并不总是匹配。下面的代码旨在使用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都需要永远。有没有更好的写作方式?
答案 0 :(得分:1)
是的,这就是你获得例外的原因 -
j
使用了错误的最大长度。你肯定需要改变:
for j in range(len(wavelength)):
到
for j in range(len(filterwavelength)):
人们不知道你的意思是“当我不想要它时循环”
答案 1 :(得分:1)
j
范围超过wavelength
,但后来将其用作filteredwavelength
(最初为空)的索引。您还可以修改循环中的i
和j
,这通常是(但并非总是)可疑的。