Python scipy:插值、立方和;线性的
我试图插值我的数据集(第一列T是时间,第三列T是实际数据): 但我看到线性插值和三次插值之间有一些奇怪的区别。 以下是线性预测的结果: 以下是立方体的相同情况: 我不确定,为什么图形一直在跳跃并且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值
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()