编辑:对代码进行编辑以产生与Matlab一致的结果。见下文。
我正在将Matlab脚本转换为Python,并且线性插值结果在某些情况下会有所不同。我想知道为什么以及是否有任何方法可以解决此问题?
这是Matlab和Python中的代码示例以及结果输出(请注意,在这种情况下t恰好等于tin):
MATLAB:
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相同的结果)
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];
x = np.interp(t,tin,xin)
array([ nan, 1392., 1406., nan, nan, nan, nan])
# Edit
# Find indices where t == tin and if the np.interp output
# does not match the xin array, overwrite the np.interp output at those
# indices
same = np.where(t == tin)[0]
not_same = np.where(xin[same] != x[same])[0]
x[not_same] = xin[not_same]
答案 0 :(得分:1)
看起来Matlab的插值中包括一个附加的相等性检查。
线性一维插值通常是通过找到两个跨越输入值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))