Python 为什么linspace和interp1d的输出总是相同的?

Python 为什么linspace和interp1d的输出总是相同的?,python,numpy,scipy,interpolation,Python,Numpy,Scipy,Interpolation,所以我在做我的作业,我们被要求使用插值(线性插值)同样。我们被要求使用scipy.interpolate中的interp1d包,并使用它生成新的y值,给定新的x值和旧坐标(x1,y1)和(x2,y2) 为了获得新的x坐标(我们称之为x\u new),我在(x1,x2)和新的y坐标(我们称之为y\u new)之间使用interp1d函数在x\u new上找到了这个坐标 然而,我也注意到,在(y1,y2)上应用np.linspace生成的y\u new值与我们在x\u new上从interp1d得到

所以我在做我的作业,我们被要求使用插值(线性插值)同样。我们被要求使用
scipy.interpolate中的
interp1d
包,并使用它生成新的
y
值,给定新的
x
值和旧坐标
(x1,y1)
(x2,y2)

为了获得新的
x
坐标(我们称之为
x\u new
),我在
(x1,x2)
和新的
y
坐标(我们称之为
y\u new
)之间使用
interp1d
函数在
x\u new
上找到了这个坐标

然而,我也注意到,在
(y1,y2)
上应用
np.linspace
生成的
y\u new
值与我们在
x\u new
上从
interp1d
得到的值完全相同

谁能给我解释一下为什么会这样?如果这是真的,它总是真的吗?
如果这总是正确的,那么当我们可以使用
np.linspace
时,为什么我们需要使用
interp1d
函数呢

以下是我编写的代码:

import scipy.interpolate as ip
import numpy as np

x = [-1.5, 2.23]
y = [0.1, -11]

x_new = np.linspace(start=x[0], stop=x[-1], num=10)
print(x_new)

y_new = np.linspace(start=y[0], stop=y[-1], num=10)
print(y_new)

f = ip.interp1d(x, y)
y_new2 = f(x_new)
print(y_new2)  # y_new2 values always the same as y_new

您偶然发现这一点的原因是,对于线性函数的插值,您只使用两点。您有两个不同的
x
值和相应的
y
值作为输入。然后要求
interp1d
找到最适合输入数据的线性函数
f(x)=m*x+b
。因为只有两个点作为输入数据,所以有一个精确的解决方案,因为线性函数由两个点精确定义。看看这个:拿一张纸,画两个点,然后想想你能画多少条直线来连接这些点

从两个输入点获得的线性函数由参数
m=(y1-y2)/(x1-x2)
b=y1-m*x1
定义,其中
(x1,y1)、(x2,y2)
是代码段中的两个输入点(或
x
y
数组中的元素)

那么,现在
np.linspace(start,stop,num,…)
做什么呢?它在
start
stop
之间提供
num
等间距点。这些点是
start
start+delta
end
。步长
delta
delta=(end-start)/(num-1)给出
。-1来自于您希望包含端点的事实。因此,区间中的
n
第个点将位于
xn=x1+n*(x2-x1)/(num-1)
。在应用
interp1d
中的线性函数后,这些点的值将是多少

f(xn)=m*xn+b=(y1-y2)/(x1-x2)*(x1+n/(num-1)*(x2-x1))+y1-(y1-y1)/(x1-x2)*x1
。将其简化为
f(xn)=(y2-y1)*n/(num-1)+y1
。这正是您从
np.linspace(y1,y2,num)
得到的结果


现在,这总是有效吗?不!我们利用了这样一个事实,即我们的线性函数是由我们在
np.linspace
中使用的区间的两个端点定义的。因此,这通常不起作用。尝试在输入列表中再添加一个
x
值和一个
y
值,然后比较结果。

为什么选择y你无意中发现,一个线性函数的插值只使用两个点。你有两个不同的
x
值作为输入,对应
y
值。然后你要求
interp1d
找到一个线性函数
f(x)=m*x+b
最适合您的输入数据。因为您只有两个点作为输入数据,所以有一个精确的解决方案,因为线性函数是由两个点精确定义的。要了解这一点,请拿一张纸,画两个点,然后想想您可以画多少条直线来连接这些点

从两个输入点获得的线性函数由参数
m=(y1-y2)/(x1-x2)
b=y1-m*x1
定义,其中
(x1,y1)、(x2,y2)
是代码段中的两个输入点(或
x
y
数组中的元素)

那么,现在
np.linspace(start,stop,num,…)
做什么呢?它在
start
stop
之间提供
num
等间距点。这些点是
start
start+delta
end
。步长
delta
delta=(end-start)/(num-1)给出
。-1来自于您希望包含端点的事实。因此,区间中的
n
第个点将位于
xn=x1+n*(x2-x1)/(num-1)
。在应用
interp1d
中的线性函数后,这些点的值将是多少

f(xn)=m*xn+b=(y1-y2)/(x1-x2)*(x1+n/(num-1)*(x2-x1))+y1-(y1-y1)/(x1-x2)*x1
。将其简化为
f(xn)=(y2-y1)*n/(num-1)+y1
。这正是您从
np.linspace(y1,y2,num)
得到的结果

现在,这总是有效吗?不!我们利用了这样一个事实,即我们的线性函数是由我们在
np.linspace
中使用的区间的两个端点定义的。因此,这通常不起作用。尝试在输入列表中再添加一个
x
值和一个
y
值,然后比较结果