我正在尝试编写一段代码,将过滤器应用于数据集。滤波器有两个关键的数据位,波长和吞吐量。数据文件还有两个关键的数据位,波长和流量。不幸的是,滤波器文件和数据文件中的波长并不总是匹配的。下面的代码旨在使用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)
上,那么程序会连续运行,但我认为它会在每个I的所有j上循环,这需要永远。有更好的写作方法吗
是的,这就是为什么你会有例外
j
使用了错误的最大长度。你肯定需要改变:for j in range(len(wavelength)):
至
for j in range(len(filterwavelength)):
人们不知道你说的“我不想循环”是什么意思
您在
wavelength
上有j
范围,但随后将其用作filteredwavelength
(最初为空)的索引。还可以修改循环中的i
和j
,这通常(但并不总是)可疑相关问题 更多 >
编程相关推荐