为什么scipy中的interp1d在xarray的前两个值相同时给出NaN?(填充值=0)

2024-09-29 17:44:30 发布

您现在位置:Python中文网/ 问答频道 /正文

import numpy as np
from scipy.interpolate import interp1d

x = np.array([ 0,  0,   0,  0,   0,  30])
time = np.array([ 5,  5,  10,  10,  10,  20])

intx = interp1d(time,x,'linear', 0, True, False, 0)
print intx([4,5,5,6,10,11,20, 20.0001])

>>> [  0.  nan  nan   0.   0.   3.  30.   0.]

如您所见,在所有情况下,除了时间值==第一对值外,插入式都返回一个实数。在

我知道纽比。独一无二(),这只是一个学术问题。这是运行在iPython中的anacondapython2.7。在

谢谢!在


Tags: fromimportnumpyfalsetruetimeasnp
2条回答

在上面的例子中,我建议只使用Y变量的采样点。考虑以下几点。在

x= [275, 275]
y= [120, 120]

以上点表示一条与Y轴平行的线。因此,直线的斜率是未定义的。所以,在这里你可以只对Y变量采样,然后为每个采样点复制X变量的值。您会发现下面的图很直观。
地块1-
Two initial points

地块2-
Sample only y points keeping x same!

您的问题是您试图插值超出间隔的点,这导致scipy.interpolate.interp1d在试图计算两点之间的斜率时启动RuntimeWarning(它发生在插值e.py416号线附近):

slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]

看看在间隔内移动点时会发生什么:

^{pr2}$

如果你把它画出来,你会发现一切都是有意义的:

enter image description here

这就是interp1d的工作原理:

  1. x和{}传递给interp1d,它将创建一个f可调用方法
  2. 然后传递新的x_new值,其中要计算f,它将执行以下步骤:

    • 找到原始数据中插入插值值的位置。在

      >>> x_new_indices = np.searchsorted(x, X)
      
    • 剪辑x_新的指数,使它们在x指数的范围内,并且至少为1。删除x_new[n] = x[0]的错误插值

      >>> x_new_indices = x_new_indices.clip(1, len(x)-1).astype(int)
      
    • 计算每个区域的斜率。在

      >>> lo = x_new_indices - 1
      >>> hi = x_new_indices
      >>> x_lo = x[lo]
      >>> x_hi = x[hi]
      >>> y_lo = y[lo]
      >>> y_hi = y[hi]
      
    • 计算x_new中每个条目的实际值。在

      >>> slope = (y_hi - y_lo) / (x_hi - x_lo)[:, None]
      >>> y_new = slope*(x_new - x_lo)[:, None] + y_lo
      

相关问题 更多 >

    热门问题