средневзвешенное значение из массива в Python - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно сформировать новую последовательность чисел, заменив каждое значение данных, начиная с 4-й записи и заканчивая 4-й от последней записи, средневзвешенным значением семи точек вокруг него, используя следующую формулу:

(y[i-3] + 2y[i-2] + 3y[i-1] + 3y[i] + 3y[i+1] + 2y[i+2] + y[i+3]) // 15 

(ПРИМЕЧАНИЕ. Число i- или i + some является индексом в случае, если это не очевидно.)

Вот код, который у меня есть, который создает необработанный график, но яНужно сгладить новый график по приведенной выше формуле. Файл данных создает массив целых чисел, настроенный как [-24, 4, -4, -12, -52...]. Я даже не уверен, где начать с формулы, любая помощь будет оценена.

from matplotlib import pyplot as plt

with open('2_Record2308.dat', 'r') as f:

    data = [int(x) for x in f]

graph = data

fig, ax = plt.subplots()

ax.plot(graph)

ax.legend()

ax.set_ylabel('Raw')

plt.tight_layout()

plt.show()

1 Ответ

0 голосов
/ 07 ноября 2019

Этот код должен выполнить трюк:

avg = [(sum(y) + sum(y[1:-1]) + sum(y[2:-2])) // 15 
       for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])] 

Здесь zip(data[:-6], data[1:-5], ...) создает последовательные 7-кортежи.

И sum(y) принимает по 7 чисел каждый раз. sum(y[1:-1]) снова берет 5 внутренних чисел. sum(y[2:-2]) принимает 3 внутренних числа в третий раз.

Кстати, добавление 7 до деления на 15 будет ближе к усреднению. В исходной формулировке среднее значение всегда округляется вниз.

Итак, я бы предложил (sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15

Вот тест, основанный на вашем коде и данных случайного блуждания.

from matplotlib import pyplot as plt
import random

def do_averaging_7(data):
    return [(sum(y) + sum(y[1:-1]) + sum(y[2:-2]) + 7) // 15
            for y in zip(data[:-6], data[1:-5], data[2:-4], data[3:-3], data[4:-2], data[5:-1], data[6:])]

data = [random.randrange(-100,101) for _ in range(100)]
for i in range(1,len(data)):
    data[i] += data[i-1]
avg = do_averaging_7(data)

fig, ax = plt.subplots()
ax.plot(range(len(data)), data, "blue")
ax.plot(range(3, 3+len(avg)), avg, color="red")
ax.set_ylabel('Raw')
plt.tight_layout()
plt.show()

Итоговый участок: resulting plot

...