Как мне уменьшить числовой массив 1d? - PullRequest
0 голосов
/ 14 ноября 2018

Это кажется очень простой проблемой, но я не могу найти решение. Предположим, у меня есть функция синуса 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 выборок, поэтому я попробовал метод этот ответ на аналогичный вопрос ...

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 выборок (т.е. разница между исходными npts и npts2) равны 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 голосов
/ 14 ноября 2018

Ваша начальная частота выборки 8000 не делится на 6000, поэтому ее нельзя просто уменьшить, как и указанный пост.В вашем сценарии scipy's resample должен работать.

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