【问题标题】:Why is the output of linspace and interp1d always the same?为什么 linspace 和 interp1d 的输出总是一样的?
【发布时间】:2018-09-08 16:54:51
【问题描述】:

所以我正在做我的任务,我们需要使用插值(线性插值)来做同样的事情。我们被要求使用来自scipy.interpolateinterp1d 包,并使用它来生成新的y 值给定新的x 值和旧坐标(x1,y1)(x2,y2)
为了获得新的x 坐标(我们称之为x_new),我在(x1,x2) 和新的y 坐标之间使用了np.linspace(我们称之为y_new)我发现在@987654334 上使用interp1d 函数@。

但是,我也注意到在 (y1,y2) 上应用 np.linspace 会生成与 interp1d 上的 x_new 完全相同的 y_new 值。

谁能给我解释一下为什么会这样?如果这是真的,它总是真的吗?
如果这总是正确的,为什么我们在可以使用 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

【问题讨论】:

    标签: python numpy scipy interpolation


    【解决方案1】:

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

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

    那么,现在np.linspace(start, stop, num,...) 做了什么?它在startstop 之间为您提供num 均匀分布的点。这些点是startstart + delta、...、end。步宽deltadelta=(end-start)/(num - 1) 给出。 -1 来自您想要包含端点的事实。因此,间隔中的第 nth 点将位于 xn=x1+n*(x2-x1)/(num-1)。在我们应用来自interp1d 的线性函数后,这些点最终会达到什么y 值?让我们插上它:

    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) 得到的,即f(xn)=yn

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多