Как вы сгладить значения в массиве (без полиномиальных уравнений)? - PullRequest
0 голосов
/ 07 ноября 2019

Так что в основном у меня есть некоторые данные, и мне нужно найти способ сгладить их (чтобы полученная из них линия была гладкой и не нервной). На графике данные прямо сейчас выглядят так: placeholder text for image

, и я хочу, чтобы это выглядело так: placeholder text for image

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

Я также пытался this , но это не сработало по той же причине, что и выше.

График определяется следующим образом:

gx = [] #x is already taken so gx -> graphx
gy = [] #same as above

#Put in data

#Get nice data #[this is what I need help with]

#Plot nice data and original data

plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

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

Ответы [ 2 ]

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

Я понял, усреднив 4 результата, я смог значительно сгладить график. Вот демонстрация:

demo

Надеюсь, это поможет всем, кто в этом нуждается

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

Вы можете использовать фильтр бесконечного горизонта

import numpy as np
import matplotlib.pyplot as plt

x = 0.85 # adjust x to use more or less of the previous value
k = np.sin(np.linspace(0.5,1.5,100))+np.random.normal(0,0.05,100)
filtered = np.zeros_like(k)
#filtered = newvalue*x+oldvalue*(1-x)
filtered[0]=k[0]
for i in range(1,len(k)):
# uses x% of the previous filtered value and 1-x % of the new value
    filtered[i] = filtered[i-1]*x+k[i]*(1-x) 

plt.plot(k)
plt.plot(filtered)
plt.show()
...