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
值,然后比较结果