如何对一维numpy数组进行下采样?

时间:2018-11-14 19:03:18

标签: python numpy downsampling

这似乎是一个非常简单的问题,但我无法解决。假设我有一个包含8000个样本的正弦函数y

import numpy as np

Fs = 8000
f = 1
npts = 8000
x = np.arange(npts)
y = np.sin(2 * np.pi * f * x / Fs)

我想将此函数降采样为6000个采样,所以我尝试了this answer to a similar question ......

的方法。
import math
from scipy import nanmean

#number of samples I want to downsample to
npts2 = 6000

#calculating the number of NaN values to pad to the array
n = math.ceil(float(y.size)/npts2)
pad_size = n*npts2 - len(y)
padded = np.append(y, np.zeros(int(pad_size))*np.NaN)

#downsampling the reshaped padded array with nanmean
downsampled = nanmean(padded.reshape((npts2, int(n))), axis = 1)

这给了我一个正确长度的数组(6000),但是最后2000个样本(即原始nptsnpts2之间的差)是NaN,并且函数本身仅占前4000个样本。

有没有更好的方法可以使此正弦函数的长度为6000个样本?谢谢!

修改

感谢您的答复-我意识到我现在以错误的方式进行了攻击。我决定在scipy.interpolate.interp1d函数上使用y函数,然后将生成的np.linspace数组传递给该数组,并插入想要的点数。这给了我正确缩放的输出。

from scipy.interpolate import interp1d

def downsample(array, npts):
    interpolated = interp1d(np.arange(len(array)), array, axis = 0, fill_value = 'extrapolate')
    downsampled = interpolated(np.linspace(0, len(array), npts))
    return downsampled

downsampled_y = downsample(y, 6000)

1 个答案:

答案 0 :(得分:0)

您的8000的初始采样率不能被6000整除,因此不能像参考文章一样简单地进行降采样。在您的情况下,scipy的resample应该可以工作。

from scipy import signal
downsampled =  signal.resample(y, 6000)