python – `ValueError:x_new中的值高于插值范围. – 除了不提
我在scipy interp1d函数中收到此错误.通常,如果x不是单调增加,则会产生此错误.
import scipy.interpolate as spi def refine(coarsex,coarsey,step): finex = np.arange(min(coarsex),max(coarsex)+step,step) intfunc = spi.interp1d(coarsex,axis=0) finey = intfunc(finex) return finex,finey for num,tfile in enumerate(files): tfile = tfile.dropna(how='any') x = np.array(tfile['col1']) y = np.array(tfile['col2']) finex,finey = refine(x,y,0.01) 代码是正确的,因为它成功地处理了6个数据文件并将错误扔到了第7个.所以数据一定有问题.但据我所知,数据一直在增加. 有两件事可以帮助我: >一些头脑风暴 – 如果数据确实是单调的 UPDATE 所以问题在于,由于某种原因,max(finex)大于max(粗糙)(一个是.x39而另一个是.x4).我希望将原始值四舍五入到2位有效数字可以解决问题,但事实并非如此,它显示的数字较少,但仍然计算未显示的数字.我能做些什么呢? 解决方法
如果您正在运行Scipy v.1.17.0或更新版本,那么您可以使用
pass
fill_value='extrapolate' to spi.interp1d ,并且它将推断出这些位于插值范围之外的值.所以定义你的插值函数如下:
intfunc = spi.interp1d(coarsex,axis = 0,fill_value =“extrapolate”) 但是要预先警告! 根据您的数据外观和您正在执行的插值类型,外推值可能是错误的.如果您有嘈杂或非单调数据,则尤其如此.在您的情况下,您可能没问题,因为您的x_new值仅略微超出了插值范围. 这里简单演示了这个功能如何很好地工作,但也给出了错误的结果. import scipy.interpolate as spi import numpy as np x = np.linspace(0,1,100) y = x + np.random.randint(-1,100)/100 x_new = np.linspace(0,1.1,100) intfunc = spi.interp1d(x,fill_value="extrapolate") y_interp = intfunc(x_new) import matplotlib.pyplot as plt plt.plot(x_new,y_interp,'r',label='interp/extrap') plt.plot(x,'b--',label='data') plt.legend() plt.show() 因此,插值部分(红色)运行良好,但由于噪声,外推部分显然无法遵循该数据中的其他线性趋势.因此,请对您的数据有所了解,并谨慎行事. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |