Python scipy:插值、立方和;线性的

Python scipy:插值、立方和;线性的,python,scipy,interpolation,Python,Scipy,Interpolation,我试图插值我的数据集(第一列T是时间,第三列T是实际数据): 但我看到线性插值和三次插值之间有一些奇怪的区别。 以下是线性预测的结果: 以下是立方体的相同情况: 我不确定,为什么图形一直在跳跃并且y\u平滑包含不正确的值 ipdb> y_smooth_linear.max() 141.5481144 ipdb> y_smooth_cubic.max() 1.2663431888584225e+18 有谁能向我解释一下,我如何修改代码以实现正确的插值 UPD:这里是对于相同的x值

我试图插值我的数据集(第一列T是时间,第三列T是实际数据):

但我看到线性插值和三次插值之间有一些奇怪的区别。 以下是线性预测的结果:

以下是立方体的相同情况:

我不确定,为什么图形一直在跳跃并且
y\u平滑
包含不正确的值

ipdb> y_smooth_linear.max()
141.5481144
ipdb> y_smooth_cubic.max()
1.2663431888584225e+18
有谁能向我解释一下,我如何修改代码以实现正确的插值


UPD:这里是

对于相同的x值,您的数据包含多个y值。这违反了大多数插值算法的假设


丢弃具有重复x值的行,平均每个x的y值,或者为x值获得更好的分辨率,使它们不再相同。

您的数据包含多个相同x值的y值。这违反了大多数插值算法的假设

丢弃具有重复x值的行,平均每个x的y值,或者为x值获得更好的分辨率,使其不再相同。

鉴于
x
具有重复值,您可以使用
np.unique
要为每个
x
选择唯一的
y

x2, idx = np.unique(x, return_index=True)
y2 = y[idx]
return\u index=True
不仅返回原始
x
数组中唯一
x
s的唯一值
x2
,还返回其位置
idx
。请注意,这将为每个唯一的
x
选择
y
的第一个值

如果您想平均每个唯一的
x
的所有
y
值,可以使用 :

return\u inverse=True
告诉
np.unique
返回 可以重建原始阵列。这些指数也可以作为分类指数 标签或“因子”,这是它们在调用中的使用方式
binned_统计数据


鉴于
x
有重复的值,您可以使用
np.unique
要为每个
x
选择唯一的
y

x2, idx = np.unique(x, return_index=True)
y2 = y[idx]
return\u index=True
不仅返回原始
x
数组中唯一
x
s的唯一值
x2
,还返回其位置
idx
。请注意,这将为每个唯一的
x
选择
y
的第一个值

如果您想平均每个唯一的
x
的所有
y
值,可以使用 :

return\u inverse=True
告诉
np.unique
返回 可以重建原始阵列。这些指数也可以作为分类指数 标签或“因子”,这是它们在调用中的使用方式
binned_统计数据



可能相关:@rth我已经添加了问题的链接可能相关:@rth我已经添加了问题的链接也看到了这一点,
scipy.interpolate.splmake
似乎是
scipy
中目前唯一支持它的插值例程。也看到了这一点,
scipy.interpolate.splmake
似乎是目前在
scipy
中唯一支持它的插值例程。
import scipy.stats as stats
x2, inv = np.unique(x, return_inverse=True)
y2, bin_edges, binnumber = stats.binned_statistic(
    x=inv, values=y, statistic='mean', bins=inv.max()+1)
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import scipy.stats as stats

data = np.genfromtxt("data.csv", delimiter=" ")

x = data[:, 0]
y = data[:, 1]

x2, idx, inv = np.unique(x, return_index=True, return_inverse=True)
y_uniq = y[idx]
y_ave, bin_edges, binnumber = stats.binned_statistic(
    x=inv, values=y, statistic='mean', bins=inv.max()+1)

xx = np.linspace(x.min(), x.max(), 1000)
y_smooth = interp1d(x, y)(xx)
y_smooth2 = interp1d(x2, y_uniq, kind="cubic")(xx)
y_smooth3 = interp1d(x2, y_ave, kind="cubic")(xx)

fig, ax = plt.subplots(nrows=3, sharex=True)

ax[0].plot(xx, y_smooth, "r-", label='linear')
ax[1].plot(xx, y_smooth2, "b-", label='cubic (first y)')
ax[2].plot(xx, y_smooth3, "b-", label='cubic (ave y)')
ax[0].legend(loc='best')
ax[1].legend(loc='best')
ax[2].legend(loc='best')
plt.show()