![](/img/trans.png)
[英]How can I fix “SystemError: null argument to internal routine” error when python callback in called from C
[英]Python: How to fix interpolation routine
我正在嘗試編寫一段代碼以將過濾器應用於數據集。 過濾器有兩個關鍵數據位:波長和吞吐量。 數據文件還具有兩個關鍵數據位:波長和通量。 不幸的是,濾光片文件和數據文件中的波長並不總是匹配。 下面的代碼旨在使用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
wavelength
(最初為空)的索引。 您還可以在循環中修改i
和j
,這通常(但並非總是如此)令人懷疑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.