向数据添加更多样本点

时间:2010-11-01 20:37:25

标签: python numpy scipy

给定一些形状为20x45的数据,其中每一行是一个单独的数据集,比如20个不同的正弦曲线,每个数据点有45个数据点,我将如何获得相同的数据,但形状为20x100?

换句话说,我有一些形状为20x45的数据A,以及一些长度为20x100的数据B,我希望A的形状为20x100,所以我可以更好地比较它们。

这适用于Python和Numpy / Scipy。

我认为它可以使用样条线来完成,所以我正在寻找一个简单的例子,可能只是2x10到2x20或其他东西,其中每一行只是一行,以演示解决方案。

谢谢!

3 个答案:

答案 0 :(得分:6)

在我输入这个例子的时候,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()

alt text

答案 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)

如果您的应用程序对精度不敏感或者您只想快速浏览,则可以使用相邻已知数据点的平均值填充未知数据点(换句话说,进行简单的线性插值)。