Python 为什么即使值是单调递增的,我也不能插值?
我有两个数组,我以这种方式绘制:Python 为什么即使值是单调递增的,我也不能插值?,python,scipy,interpolation,Python,Scipy,Interpolation,我有两个数组,我以这种方式绘制: plt.plot(x1, x2) 我想知道x2在x1=2,5,75,10100和1000时的值是多少。由于可能不存在所有值,我使用以下方法进行插值: from scipy.interpolate import interp1d f1=interp1d(x1, x2) f2=interp1d(x1, x2, kind='cubic') 但是f2抛出此错误: ValueError:x应该是一维排序数组。\u类似于。 但这些值是单调递增的,正如预期的: 我做错了
plt.plot(x1, x2)
我想知道x2
在x1=2,5,75,10100和1000时的值是多少。由于可能不存在所有值,我使用以下方法进行插值:
from scipy.interpolate import interp1d
f1=interp1d(x1, x2)
f2=interp1d(x1, x2, kind='cubic')
但是f2
抛出此错误:
ValueError:x应该是一维排序数组。\u类似于。
但这些值是单调递增的,正如预期的:
我做错了什么
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])
x2
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])
它正在做的测试是:
np.any(x1[1:] <= x1[:-1])
它正在做的测试是:
np.any(x1[1:] <= x1[:-1])
在进行插值之前,只需添加这两行:
x1[0] -= 0.0000001
x1[-2] += 0.0000001
看起来with epsilon不起作用只需在执行插值之前添加这两行:
x1[0] -= 0.0000001
x1[-2] += 0.0000001
看起来epsilon不起作用有没有可能因为x1中的值相等(例如前两个值),所以样条立方不起作用?从文档中可以看出,它应该是有意义的,因为它们的插值方式我们可以看到x1
的前两个值的数字是相同的。如果这两个值实际上是相同的,那么x1
就不是严格单调递增的。@WarrenWeckesser同意。我没有注意到他们。并且没有区分单调递增
和严格单调递增
。我的数据是否有其他方法?因此,您确实使用不同的x2
值重复了x1
值?您希望插值器如何处理这些数据?也就是说,插值器在x1
的其中一个重复值处应该返回什么?是否可能是因为在x1中有相等的值(例如前两个值),样条立方不工作?从文档中可以看出,它应该是有意义的,因为它们的插值方式我们可以看到x1
的前两个值的数字是相同的。如果这两个值实际上是相同的,那么x1
就不是严格单调递增的。@WarrenWeckesser同意。我没有注意到他们。并且没有区分单调递增
和严格单调递增
。我的数据是否有其他方法?因此,您确实使用不同的x2
值重复了x1
值?您希望插值器如何处理这些数据?也就是说,插值器在重复的x1
值之一时应该返回什么?非常感谢!不幸的是,我无法更改这些值本身,因为它们是我计算的一部分。对于非线性数据,是否有一种替代插值技术不受此限制。您可以将ε添加/减去重复值,这不会影响结果,但不再影响结果equal@SembeiNorimaki请你解释一下,好吗?我不知道怎么做。不清楚当你有相同的x1对应不同的x2时会发生什么。你可以在maximusdooku删除它们——不确定这是否合适。再见,非常感谢!不幸的是,我无法更改这些值本身,因为它们是我计算的一部分。对于非线性数据,是否有一种替代插值技术不受此限制。您可以将ε添加/减去重复值,这不会影响结果,但不再影响结果equal@SembeiNorimaki请你解释一下,好吗?我不知道怎么做。不清楚当你有相同的x1对应不同的x2时会发生什么。你可以在maximusdooku删除它们——不确定这是否合适。请参阅edit此解决方案不会对我进行扩展,因为我将在数千个阵列上执行此操作。我不知道会提前重复哪些索引。然后你需要迭代这些值,当你看到重复的值时,这个解决方案对我来说不会扩展,因为我将在数千个数组上进行。我不知道哪些索引会提前被重复,然后你需要对这些值进行迭代,当你看到重复的值时,应用这个