向数据添加更多样本点
假设你有一些数据,形状是20行45列,也就是说每一行都是一组独立的数据,比如20条不同的正弦曲线,每条曲线有45个数据点。现在你想把这些数据变成20行100列的形状。
换句话说,你有一组数据A,形状是20行45列,还有一组数据B,长度是20行100列。你希望把数据A变成20行100列,这样就能更好地进行比较。
这个问题是关于Python和Numpy/Scipy的。
我想这可以通过样条插值来实现,所以我在找一个简单的例子,可能是2行10列变成2行20列之类的,确保每一行只是简单的一条线,以便演示解决方案。
谢谢!
3 个回答
0
如果你的应用对精确度要求不高,或者你只是想快速了解情况,可以用周围已知数据点的平均值来填补那些未知的数据点。简单来说,就是用简单的线性插值方法来处理。
1
一种方法是使用 scipy.interpolate.interp1d 这个工具:
import scipy as sp
import scipy.interpolate
import numpy as np
x=np.linspace(0,2*np.pi,45)
y=np.zeros((2,45))
y[0,:]=sp.sin(x)
y[1,:]=sp.sin(2*x)
f=sp.interpolate.interp1d(x,y)
y2=f(np.linspace(0,2*np.pi,100))
如果你的数据点比较多,可能就不需要使用更高级的插值方法了。
11
在我打这个例子的时候,Ubuntu已经先发制人了,不过他的例子只是用了线性插值,这个用numpy.interpolate可以更简单地实现……(其实区别只是scipy.interpolate.interp1d里的一个关键词参数而已)。
我想还是把我的例子放上来,因为它展示了如何用scipy.interpolate.interp1d来做三次样条插值……
import numpy as np
import scipy as sp
import scipy.interpolate
import matplotlib.pyplot as plt
# Generate some random data
y = (np.random.random(10) - 0.5).cumsum()
x = np.arange(y.size)
# Interpolate the data using a cubic spline to "new_length" samples
new_length = 50
new_x = np.linspace(x.min(), x.max(), new_length)
new_y = sp.interpolate.interp1d(x, y, kind='cubic')(new_x)
# Plot the results
plt.figure()
plt.subplot(2,1,1)
plt.plot(x, y, 'bo-')
plt.title('Using 1D Cubic Spline Interpolation')
plt.subplot(2,1,2)
plt.plot(new_x, new_y, 'ro-')
plt.show()