Scipy interp1d 三次插值结果在 scipy 0.18.1 和 1.2.1 之间不同?
Scipy interp1d cubic interpolation results different between scipy 0.18.1 and 1.2.1?
使用 interp1d
通过 kind='cubic'
插值获得的结果似乎在 scipy 0.18.1
和 1.2.1
之间变化。我对前者使用 python 2.7.12
/numpy 1.12.0
,对后者使用 python 3.6.8
/numpy 1.16.2
。源代码中的哪个更改导致了不同的结果?
示例代码:
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
np.random.seed(1000)
n_p = 6
n_p_interpolated = 11
a = np.linspace(0,5,n_p)
a_interpolated = np.linspace(0,5,n_p_interpolated)
b = np.random.rand(n_p)
b_interpolated = interp1d(a,b,kind='cubic')(a_interpolated)
print('b:', b)
print('b_interpolated:', b_interpolated)
plt.ion()
plt.figure()
plt.plot(a,b,label='original data')
plt.plot(a_interpolated,b_interpolated,label='interpolated data')
plt.legend()
plt.xlim(-1,6)
plt.ylim(-0.2,1)
与scipy 0.18.1
:
('b:', array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454,
0.21233268]))
('b_interpolated:', array([ 0.65358959, -0.1292027 , 0.11500694, 0.64514961, 0.95028286,
0.75328508, 0.4821914 , 0.58350879, 0.87247454, 0.95267129,
0.21233268]))
与scipy 1.2.1
:
b: [0.65358959 0.11500694 0.95028286 0.4821914 0.87247454 0.21233268]
b_interpolated: [ 0.65358959 -0.05237073 0.11500694 0.62584926 0.95028286 0.75365451
0.4821914 0.60133139 0.87247454 0.88101143 0.21233268]
所有插值(不在原始网格中)都不同,有些非常大(例如第二个)。
是的,构造样条曲线的算法已更改。在 scipy 0.18 及以下版本中,它使用了 find_smoothest
算法(请参阅 scipy 源存储库中的 scipy/interpolate/interpolate.py,pre scipy 0.19.0)。从0.19.0版本开始,三次方的默认算法是not-a-knot。
使用 interp1d
通过 kind='cubic'
插值获得的结果似乎在 scipy 0.18.1
和 1.2.1
之间变化。我对前者使用 python 2.7.12
/numpy 1.12.0
,对后者使用 python 3.6.8
/numpy 1.16.2
。源代码中的哪个更改导致了不同的结果?
示例代码:
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
np.random.seed(1000)
n_p = 6
n_p_interpolated = 11
a = np.linspace(0,5,n_p)
a_interpolated = np.linspace(0,5,n_p_interpolated)
b = np.random.rand(n_p)
b_interpolated = interp1d(a,b,kind='cubic')(a_interpolated)
print('b:', b)
print('b_interpolated:', b_interpolated)
plt.ion()
plt.figure()
plt.plot(a,b,label='original data')
plt.plot(a_interpolated,b_interpolated,label='interpolated data')
plt.legend()
plt.xlim(-1,6)
plt.ylim(-0.2,1)
与scipy 0.18.1
:
('b:', array([ 0.65358959, 0.11500694, 0.95028286, 0.4821914 , 0.87247454,
0.21233268]))
('b_interpolated:', array([ 0.65358959, -0.1292027 , 0.11500694, 0.64514961, 0.95028286,
0.75328508, 0.4821914 , 0.58350879, 0.87247454, 0.95267129,
0.21233268]))
与scipy 1.2.1
:
b: [0.65358959 0.11500694 0.95028286 0.4821914 0.87247454 0.21233268]
b_interpolated: [ 0.65358959 -0.05237073 0.11500694 0.62584926 0.95028286 0.75365451
0.4821914 0.60133139 0.87247454 0.88101143 0.21233268]
所有插值(不在原始网格中)都不同,有些非常大(例如第二个)。
是的,构造样条曲线的算法已更改。在 scipy 0.18 及以下版本中,它使用了 find_smoothest
算法(请参阅 scipy 源存储库中的 scipy/interpolate/interpolate.py,pre scipy 0.19.0)。从0.19.0版本开始,三次方的默认算法是not-a-knot。