Плавные агрессивные значения в списке - PullRequest
0 голосов
/ 13 января 2019

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

list = np.array([3, 3, 3, 15, 3, 3, 3])

Я сделал очень простую реализацию с удушением таких значений. Что я пробовал до сих пор.

def smooth(x, window, threshold):
    for idx, val in enumerate(x):
        if idx < window:
            continue
        avr = np.mean(
            x[idx-window:idx])

        if abs(avr - val) > threshold:
            x[idx] = avr + threshold

print(smooth(list1, 3, 1))
# [3, 3, 3, 4, 3, 3, 3]

В этом случае все работает хорошо, но на другом примере мне нужно сгладить данные другим способом (сглаживание по Гауссу для ex).

list = np.array([3, 3, 3, 15, 15, 15])
print(smooth(list, 3, 1))
# [3, 3, 3, 4, 4, 3]

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

1 Ответ

0 голосов
/ 13 января 2019

Я бы не советовал самостоятельно применять 1D-фильтрацию, поскольку

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

Вместо этого используйте богатое разнообразие существующих реализаций, например, доступных. в скучном пакете. Вы можете найти хорошо иллюстрированный пример использования здесь: Сглаживание 1D сигнала (Scipy Cookbook)

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