给定一些形状为20x45的数据,其中每一行是一个单独的数据集,比如20个不同的正弦曲线,每个数据点有45个数据点,我将如何获得相同的数据,但形状为20x100?
换句话说,我有一些形状为20x45的数据A,以及一些长度为20x100的数据B,我希望A的形状为20x100,所以我可以更好地比较它们。
这适用于Python和Numpy / Scipy。
我认为它可以使用样条线来完成,所以我正在寻找一个简单的例子,可能只是2x10到2x20或其他东西,其中每一行只是一行,以演示解决方案。
谢谢!
答案 0 :(得分:6)
我想我会包含我的示例,因为它显示使用带有三次样条线的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()
答案 1 :(得分: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))
如果您的数据非常密集,则可能没有必要使用更高阶的插值。
答案 2 :(得分:0)
如果您的应用程序对精度不敏感或者您只想快速浏览,则可以使用相邻已知数据点的平均值填充未知数据点(换句话说,进行简单的线性插值)。