2016-03-18 3 views
1

У меня есть массив данных Y, так что Y является функцией независимой переменной X (другой массив).Данные с гладким кругом

Значения в X варьируются от 0 до 360, с оберткой.

Значения в Y варьируются от -180 до 180, также с оберткой.

(То есть, эти значения углов в градусах по кругу.)

Кто-нибудь знает какой-либо функции в Python (в numpy, scipy и т.д.), способные низкочастотная фильтрация мои Y значения, функция от X?

В случае, если это вообще сбивает с толку, вот сюжет, например, данные:

enter image description here

+0

Как вы хотите, чтобы справиться с обертыванием вокруг? Если X обернется вокруг с 359 град. до 001 град., если значение Y будет сглажено другими данными около 001 град. Или должно быть обработано значение Y, как если бы оно было на 361 град.? Точно так же, как вы хотите обработать обертку Y? – RootTwo

+0

Проблема заключается в том, что существуют два массива X и Y, где Y [i] - функция X [i]. Я предполагал, что представил время. Мой вопрос в том, что если Y имеет последовательность, которая выглядит как [..., 179, 180, -179, -178, 177, ...], имеет смысл обращаться с ней буквально или как она содержала [... , 179, 180, 181, 182, 183, ...]. Аналогично для X. В моем ответе ниже я «разворачиваю» данные перед сглаживанием. – RootTwo

ответ

1

Допустим, вы начинаете с

import numpy as np 

x = np.linspace(0, 360, 360) 
y = 5 * np.sin(x/90. * 3.14) + np.random.randn(360) 

plot(x, y, '+'); 

enter image description here

Для выполнения круговой свертки, вы можете сделать следующее:

yy = np.concatenate((y, y)) 
smoothed = np.convolve(np.array([1] * 5), yy)[5: len(x) + 5] 

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

>>> plot(x, smoothed) 

enter image description here

+0

обратите внимание, что это не относится к обертке в значениях «y», но это нормально, потому что они никогда не получают значения, близкие к точке обхода (+/- 180). – dbliss

1

Вот решение с помощью панд, чтобы сделать скользящей средней. Сначала unwrap данные (необходимо преобразовать в радианы и обратно), поэтому нет разрывов (например, переход от 180 до -179). Затем вычислите скользящую среднюю и, наконец, конвертируйте обратно в обернутые данные. Кроме того, ознакомьтесь с этим numpy cookbook recipe, используя np.convolve().

import numpy as np 
import pandas as pd 

# generate random data 
X = pd.Series([(x + 5*np.random.random())%360  for x in range(-100, 600, 15)]) 
Y = pd.Series([(y + 5*np.random.random())%360 - 180 for y in range(-200, 500, 15)]) 

# 'unwrap' the angles so there is no wrap around 
X1 = pd.Series(np.rad2deg(np.unwrap(np.deg2rad(Y)))) 
Y1 = pd.Series(np.rad2deg(np.unwrap(np.deg2rad(Y)))) 

# smooth the data with a moving average 
# note: this is pandas 17.1, the api changed for version 18 
X2 = pd.rolling_mean(X1, window=3) 
Y2 = pd.rolling_mean(Y1, window=3) 

# convert back to wrapped data if desired 
X3 = X2 % 360 
Y3 = (Y2 + 180)%360 - 180 
+0

Я не вижу смысла в сглаживании 'X1'. это моя независимая переменная. никакой неопределенности нет. выше, вы думали о 'X' и' Y' как функции времени, но это не тот способ подумать об этом. как я сказал, 'Y' является функцией' X'. 'X' - это время ожидания. – dbliss

+0

p.s. спасибо за указание 'np.unwrap'. Я не знал об этом. – dbliss

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