2016-02-05 3 views
2

Я совсем новичок в Python и у меня есть массив некоторых обнаружений параметров, некоторые значения были обнаружены неправильно и (как 4555555):Weighted сглаживание 1D массива - Python

array = [1, 20, 55, 33, 4555555, 1] 

И я хочу чтобы как-то сгладить его. Сейчас я делаю это с средневзвешенным:

def smoothify(array): 
    for i in range(1, len(array) - 2): 
     array[i] = 0.7 * array[i] + 0.15 * (array[i - 1] + array[i + 1]) 
    return array 

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

Не могли бы вы помочь мне в этом?

P.S. К сожалению, если это нуб вопрос :(

Спасибо за ваше время, С наилучшими пожеланиями, Анна

ответ

1

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

import numpy as np 
array = [1, 20, 55, 33, 4555555, 1] 
arrayCompare = zip(array, array[1:] + [0], [0] + array) 

weights = [.7 * x + .15 * (y + z) for x, y, z in arrayCompare] 

avg = np.average(array, weights=weights) 
0

Поскольку вы помечено это с NumPy я написал, как я хотел бы сделать это с NumPy:.

import numpy as np 

def smoothify(thisarray): 
    """ 
    returns moving average of input using: 
    out(n) = .7*in(n) + 0.15*(in(n-1) + in(n+1)) 
    """ 

    # make sure we got a numpy array, else make it one 
    if type(thisarray) == type([]): thisarray = np.array(thisarray) 

    # do the moving average by adding three slices of the original array 
    # returns a numpy array, 
    # could be modified to return whatever type we put in... 
    return 0.7 * thisarray[1:-1] + 0.15 * (thisarray[2:] + thisarray[:-2]) 

myarray = [1, 20, 55, 33, 4555555, 1] 
smootharray = smoothify(myarray) 

Вместо прохода через ориги nal array, с numpy вы можете получить «срезы» путем индексирования. Выходной массив будет на два элемента короче входного массива. Центральными точками (n) являются thisarray [1: -1]: «От индекса элемента 1 до последнего элемента (не включительно)». Другие фрагменты: «От индекса 2 до конца» и «Все, кроме последних двух»

2

Для взвешенных целей сглаживания, вы в основном ищете для выполнения convolution. Для нашего случая, поскольку мы имеем дело с 1D-массивами, мы можем просто использовать функцию свертки 1D NumPy: np.convolve для векторизованного решения. Единственное, что следует помнить здесь, это то, что весы должны быть отменены, учитывая природу свертки, которая использует обратную версию ядра, которая скользит по основному входному массиву. Таким образом, решение было бы -

weights = [0.7,0.15,0.15] 
out = np.convolve(array,np.array(weights)[::-1],'same') 

Если вы хотите получить взвешенное среднее, вы могли бы получить те, с out/sum(weights). В нашем случае, поскольку сумма данных весов уже равна 1, поэтому выход останется таким же, как out.

Давайте участок выходной Alongwith вход для графической отладки -

# Input array and weights 
array = [1, 20, 55, 33, 455, 200, 100, 20 ] 
weights = [0.7,0.15,0.15] 

out = np.convolve(array,np.array(weights)[::-1],'same') 

x = np.arange(len(array)) 
f, axarr = plt.subplots(2, sharex=True, sharey=True) 
axarr[0].plot(x,array) 
axarr[0].set_title('Original and smoothened arrays') 
axarr[1].plot(x,out) 

Выход -

enter image description here

Смежные вопросы