Python 为什么Matlab interp1产生的结果与numpy interp不同?
编辑:编辑代码以生成与Matlab一致的结果。见下文 我正在将Matlab脚本转换为Python,在某些情况下,线性插值结果是不同的。我想知道为什么,是否有办法解决这个问题 下面是Matlab和Python中的代码示例以及结果输出(注意,在本例中t恰好等于tin): MATLAB:Python 为什么Matlab interp1产生的结果与numpy interp不同?,python,matlab,numpy,interpolation,Python,Matlab,Numpy,Interpolation,编辑:编辑代码以生成与Matlab一致的结果。见下文 我正在将Matlab脚本转换为Python,在某些情况下,线性插值结果是不同的。我想知道为什么,是否有办法解决这个问题 下面是Matlab和Python中的代码示例以及结果输出(注意,在本例中t恰好等于tin): MATLAB: t= [ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667, 736696.0125]
t= [ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667, 736696.0125];
tin =[ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667, 736696.0125];
xin = [ nan , 1392., 1406. , 1418. , nan , 1442. , nan];
interp1(tin,xin,t)
ans =
NaN 1392 1406 1418 NaN 1442 NaN
Python(numpy):
(scipy interpolate.interp1d生成与numpy相同的结果)
似乎Matlab在其插值中包含了额外的等式检查 线性1-D插值通常通过查找两个横跨输入值
x
的x值来完成,然后计算结果如下:
y = y1 + (y2-y1)*(x-x1)/(x2-x1)
如果您传入的x
值正好等于输入的x坐标之一,则例程通常会计算正确的值,因为x-x1
将为零。但是,如果您的输入数组具有nan
作为y1
或y2
的值,则这些值将传播到结果中
根据您发布的代码,我最好的猜测是Matlab的插值函数有一个额外的检查,类似于:
if x == x1:
return y1
并且numpy函数没有这个检查
要在numpy中实现相同的效果,可以执行以下操作:
np.where(t == tin,xin,np.interp(t,tin,xin))
我不知道Python的情况,但Matlab有9种不同的方法,可供
interp1
使用。。。Python也必须有几个方法。由于您没有在上面的任何代码中明确指定方法,您确定这两种语言的默认设置相同吗?顺便说一句,您的问题非常类似,您已经有评论要求您显示一些代码。如果您是同一个人,则最好通过添加此处显示的信息和代码来编辑其他问题(当其他问题完成时,您可以删除此问题以避免重复问题)。这是因为您的y值具有NAN。大概numpy实现做了类似于y1+(y2-y1)*(x-x1)/(x2-x1)
的事情,nan
被传播到结果中,matlab代码有一个特殊的检查如果(x==x1)返回y1
@Hoki我知道这个问题,但不是谁问的。我的回复是添加了我的代码(因为有一位评论者要求提供),但一位版主删除了我的代码,所以我决定制作一个新的。另外,numpy和matlab的默认值都是线性插值。@user545424您完全正确。我现在检查x==x1并返回y1的情况,得到的结果与matlab一致。
np.where(t == tin,xin,np.interp(t,tin,xin))