gpt4 book ai didi

python - 为什么 Matlab interp1 产生的结果与 numpy interp 不同?

转载 作者:行者123 更新时间:2023-12-01 07:54:56 29 4
gpt4 key购买 nike

编辑:编辑代码以产生与 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]

最佳答案

Matlab 似乎在其插值中包含了额外的相等检查。

线性一维插值通常是通过查找跨越输入值x的两个x值来完成的,然后将结果计算为:

y = y1 + (y2-y1)*(x-x1)/(x2-x1)

如果您传入的 x完全等于输入 x 坐标之一,则例程通常会计算出正确的值,因为 x- x1 将为零。但是,如果您的输入数组具有 nan 作为 y1y2,这些将传播到结果。

根据您发布的代码,我最好的猜测是 Matlab 的插值函数有一个额外的检查,如下所示:

if x == x1:
return y1

并且 numpy 函数没有此检查。

要在 numpy 中实现相同的效果,您可以这样做:

np.where(t == tin,xin,np.interp(t,tin,xin))

关于python - 为什么 Matlab interp1 产生的结果与 numpy interp 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56032848/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com