gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:40:10 31 4
gpt4 key购买 nike

这似乎是一个非常直接的问题,但我想不出解决方案。假设我有一个正弦函数 y 8000 个样本:

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)

最佳答案

您的初始采样率 8000 不能被 6000 整除,因此不能像引用的帖子那样简单地降低采样率。在您的场景中,scipy 的 resample应该管用。

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

关于python - 如何对一维 numpy 数组进行下采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53307107/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com