代码之家  ›  专栏  ›  技术社区  ›  maximusdooku

为什么我不能插值,即使值是单调增加的?

  •  0
  • maximusdooku  · 技术社区  · 7 年前

    我用这种方式绘制了两个数组:

    plt.plot(x1, x2)
    

    enter image description here

    我想知道 x2 x1=2,5,75,10,100, and 1000

    from scipy.interpolate import interp1d
    f1=interp1d(x1, x2)
    f2=interp1d(x1, x2, kind='cubic')
    

    f2 引发此错误:

    ValueError: Expect x to be a 1-D sorted array_like.

    https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html

    我做错什么了?

    x1

    array([1.00020004e+00, 1.00020004e+00, 1.00080064e+00, 1.00200401e+00,
           1.00341160e+00, 1.00603622e+00, 1.01173614e+00, 1.02165917e+00,
           1.02965404e+00, 1.04362346e+00, 1.05820106e+00, 1.07688994e+00,
           1.10107906e+00, 1.12688754e+00, 1.16063138e+00, 1.19161106e+00,
           1.23578843e+00, 1.29198966e+00, 1.35062129e+00, 1.42775557e+00,
           1.52207002e+00, 1.63345312e+00, 1.77746178e+00, 1.93124759e+00,
           2.11954218e+00, 2.37191651e+00, 2.68528464e+00, 2.97973778e+00,
           3.38983051e+00, 3.89105058e+00, 4.48430493e+00, 5.31349628e+00,
           6.28930818e+00, 7.59878419e+00, 9.38086304e+00, 1.20192308e+01,
           1.57232704e+01, 2.06611570e+01, 2.68817204e+01, 3.49650350e+01,
           4.58715596e+01, 6.57894737e+01, 8.92857143e+01, 1.38888889e+02,
           2.27272727e+02, 4.16666667e+02, 1.00000000e+03, 2.50000000e+03,
           2.50000000e+03, 5.00000000e+03])
    

    array([ 11.18083778,  12.00065196,  12.88057749,  13.82502193,
            14.838716  ,  15.92673731,  17.09453577,  18.34796088,
            19.69329106,  21.13726508,  22.68711581,  24.35060647,
            26.1360695 ,  28.05244828,  30.10934199,  32.31705361,
            34.68664159,  37.22997521,  39.95979405,  42.88977178,
            46.0345847 ,  49.40998519,  53.03288065,  56.9214182 ,
            61.09507555,  65.57475857,  70.38290604,  75.54360201,
            81.08269642,  87.02793465,  93.40909644, 100.25814508,
           107.6093875 , 115.49964612, 123.96844331, 133.05819935,
           142.81444487, 153.28604899, 164.52546404, 176.58898835,
           189.53704818, 203.43450047, 218.35095766, 234.36113639,
           251.54523176, 269.98931903, 289.78578477, 311.03378962,
           333.83976499, 358.31794618])
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Mark    7 年前

    它正在做的测试是:

    np.any(x1[1:] <= x1[:-1])
    

    <= ,这意味着数组中的相等值(如:2.50000000e+03,2.50000000e+03)将导致错误。

    更改这些和(数组开始处还有两个)将使错误消失。

    当然,这是处理数据的正确方法,但您可以删除重复数据(以及相应的x2值),方法如下:

    x3, ind = np.unique(x1, return_index = True)
    x4 = x2[ind] 
    f2=interp1d(x3, x4, kind='cubic')
    
        2
  •  0
  •   Sembei Norimaki    7 年前

    在进行插值之前,只需添加这两条直线:

    x1[0] -= 0.0000001
    x1[-2] += 0.0000001 
    

    看来用epsilon不管用