Применить функцию, результат которой зависит от предыдущих результатов, к массиву numpy - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь применить пользовательскую функцию к массиву numpy, и результат функции зависит от предыдущего результата.В частности, я пытаюсь реализовать фильтр нижних частот, используя формулу:

f(n) = f(n-1) + (a[n] - f(n-1)) * sampleRate / filterConst

Я могу, конечно, сохранить переменную состояния для f(n-1) и выполнить цикл по всему массиву.Я хочу знать, есть ли правильный способ сделать это, тот, который уважает условные соглашения.

Кроме того, я уверен, что часть моей проблемы заключается в том, что я не знаю, какой вопрос задать.Поэтому, если вы хотя бы можете указать мне правильное направление, это очень ценится.

PS: меня интересует общее решение для этого.Я понимаю, что может существовать уже существующая реализация этого фильтра нижних частот, и мне было бы интересно узнать об этом, но мне нужен общий способ реализации этого типа функции.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019
import numpy as np
from functools import reduce

def f(n): 
  return n*2

def reduce_func(n, a, sampleRate, filterConst):
  return f(n-1) + (a[n] - f(n-1)) * sampleRate / filterConst

a = np.array([1,2,3,4,5])
data = np.array([12,34,56,78,90])
sampleRate = 0.5
filterConst = 1.5

reduce(reduce_func, a)

0 голосов
/ 19 апреля 2019

Если я понимаю ваше уравнение. Я могу сделать рефакторинг.

res[n] = res[n-1]*(1-sampleRate/filterConst) + a*(sampleRate/filterConst)

следующее только быстро проверяется. Это основано на работе, которую я делал, проектируя цены, основываясь на предположениях с% и абсолютными изменениями во времени.

import numpy as np

def do_filter(arr, sample_rate, filter_const, axis=-1):
"""  arr - a np array of floats your a
     sample_rate - a scalar
     filter_const - a scalar
     axis - int The axis to project along
"""  
    factor = sample_rate / filter_const
    cum_factor = np.full_like(arr, 1-factor).cumprod(axis=axis)
    # cum_factor is effectively a price index of factors
    amt = arr * factor / cum_factor
    # amt represents the values to add in deescalated by the price index.
    return amt.cumsum(axis=axis) * cum_factor
    # return the cumsum of the deescalated values in amt reescalated.

Построив это по ценам, я не смог использовать его, так как мой период по факторам периода может быть нулевым. В этом случае это ломается. Поскольку у вас тот же период по факторам периода, это, возможно, работает для вашего случая.

Если sample_rate (или filter_const) также являются массивами, это также можно настроить для работы с массивами.

0 голосов
/ 18 апреля 2019

Если вы просто перебираете весь массив, просто выводя текущий индекс в тот же индекс в новом контейнере, это должно поддерживать ваши соглашения о крошках.

Я не знаю, было бы легче сделать фильтр нижних частот в пространстве Фурье, а затем просто поменять местами FFT? Хотя это зависит от данных, над которыми вы работаете, я полагаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...