python对一维光谱数据插值

文章介绍了如何使用Python的interpolate库对文本或CSV格式的光谱数据进行插值操作,同时提醒了避免外插值导致异常值的问题,并提供了一个针对文件夹中所有文件进行插值处理的函数。
摘要由CSDN通过智能技术生成
  • 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

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值