- List item
- 核心语句:
f = interpolate.interp1d(x, y, kind=“cubic”, bounds_error=False)
ynew = f(xnew)
建议尽量避免外插值,因为外插值会导致异常值
下面展示一些 使用python读取文件内的光谱数据进行插值的函数
。
import numpy as np
def spec_interpolate(src_filepath, target_folder,start=201,end = 1799,num=2048):
'''
函数说明:
读入一个txt或者csv文件,文件路径:src_filepath,
文件包含两列数据Adata:第一列是横坐标轴x,第二列是纵坐标轴的数值y,
通过插值改变到新的横轴坐标xnew(以start为开始值,以end为结束值,num为横坐标 的点的个数),
最后将新的数据保存为目标文件夹target_folder下的同名文件。
'''
if src_filepath.endswith('.txt'):
Adata=np.genfromtxt(src_filepath)
elif src_filepath.endswith('.csv'):
Adata=np.genfromtxt(src_filepath,delimiter=',')
x = Adata[:,0]
y = Adata[:,1]
# start = 201
# end = 1799
if x[0]<start and x[-1]>end : # 建议尽量避免外插值,因为外插值会导致异常值的出现
xnew=np.linspace(start,end,num)
if(np.abs(len(x)-2299)<30): #该语句是用于判断光谱的长度是否异常,可以根据自己的需求改删
f = interpolate.interp1d(x, y, kind="cubic", bounds_error=False)#fill_value="extrapolate"
ynew = f(xnew)
result_data=np.zeros(shape=(num,2))
result_data[:, 0] = xnew
result_data[:,1] = ynew
fpath, fname = os.path.split(src_filepath)
target_filepath = os.path.join(target_folder, fname)
if src_filepath.endswith('.txt'):
np.savetxt(target_filepath, result_data) # 默认使用科学计数法
elif src_filepath.endswith('.csv'):
np.savetxt(target_filepath, result_data, delimiter = ",")
return 0
else:
#说明该光谱的长度异常
print("光谱长度异常:",src_filepath)
return 1
else:
print("光谱上限和下限异常:", src_filepath)
return 1
def folder_spec_interpolate(src_folder, target_folder):
'''
对目标文件夹下src_folder的每一个文件都进行如上的插值处理,并将每个文件保存至目标文件夹target_folder。
'''
errorFileList=[] #用于记录异常的光谱文件
for filename in os.listdir(src_folder):
src_filepath = os.path.join(src_folder, filename)
re=spec_interpolate(src_filepath, target_folder)
if re==1 : #判断异常
errorFileList.append(src_filepath)
return errorFileList