下采样1D numpy阵列

问题描述 投票:18回答:2

我有一个1-n numpy数组,我想下采样。如果下采样栅格不完全适合数据,则可以使用以下任何方法:

  • 重叠下采样间隔
  • 将最后剩余的数值转换为单独的下采样值
  • 插值以适合栅格

基本上如果我有

1 2 6 2 1

我的下采样率为3,所有以下都可以:

3 3

3 1.5

或者插值会给我的任何东西。

我只是在寻找最快/最简单的方法。

我找到了scipy.signal.decimate,但这听起来像是对它们进行了抽取(根据需要取出它们,只在X中留下一个)。 scipy.signal.resample似乎有正确的名称,但我不明白他们在描述中的整个傅立叶的位置。我的信号不是特别周期性的。

你能帮我一把吗?这似乎是一项非常简单的任务,但所有这些功能都非常错综复杂......

python numpy scipy signal-processing resampling
2个回答
27
投票

在简单的情况下,您的数组大小可以被下采样因子(R)整除,您可以reshape您的数组,并沿新轴取平均值:

import numpy as np
a = np.array([1.,2,6,2,1,7])
R = 3
a.reshape(-1, R)
=> array([[ 1.,  2.,  6.],
         [ 2.,  1.,  7.]])

a.reshape(-1, R).mean(axis=1)
=> array([ 3.        ,  3.33333333])

在一般情况下,您可以使用NaN将数组填充到可被R整除的大小,并使用scipy.nanmean取平均值。

import math, scipy
b = np.append(a, [ 4 ])
b.shape
=> (7,)
pad_size = math.ceil(float(b.size)/R)*R - b.size
b_padded = np.append(b, np.zeros(pad_size)*np.NaN)
b_padded.shape
=> (9,)
scipy.nanmean(b_padded.reshape(-1,R), axis=1)
=> array([ 3.        ,  3.33333333,  4.])

0
投票

如果数组大小不能被下采样因子(R)整除,则可以使用np.linspace后跟每个子数组的均值来完成数组的重新整形(分裂)。

input_arr = np.arange(531)

R = 150 (number of split)

split_arr = np.linspace(0, len(input_arr), num=R+1, dtype=int)

dwnsmpl_subarr = np.split(input_arr, split_arr[1:])

dwnsmpl_arr = np.array( list( np.mean(item) for item in dwnsmpl_subarr[:-1] ) )
© www.soinside.com 2019 - 2024. All rights reserved.