Python 平滑圆形数据

Python 平滑圆形数据,python,numpy,scipy,filtering,smooth,Python,Numpy,Scipy,Filtering,Smooth,我有一个数据数组Y,因此Y是一个自变量X(另一个数组)的函数 X中的值在0到360之间变化,带环绕 Y中的值在-180到180之间变化,也有环绕 (也就是说,这些值是围绕圆的角度(以度为单位) 有人知道Python中有任何函数(在numpy、scipy等)能够作为X的函数对myY值进行低通过滤吗 为了避免混淆,下面是示例数据图: 这里有一个使用熊猫做移动平均线的解决方案。首先展开数据(需要转换为弧度并返回),因此不存在不连续性(例如,从180跳到-179)。然后计算移动平均值,如果需要,最后转换

我有一个数据数组
Y
,因此
Y
是一个自变量
X
(另一个数组)的函数

X
中的值在0到360之间变化,带环绕

Y
中的值在-180到180之间变化,也有环绕

(也就是说,这些值是围绕圆的角度(以度为单位)

有人知道Python中有任何函数(在
numpy
scipy
等)能够作为
X
的函数对my
Y
值进行低通过滤吗

为了避免混淆,下面是示例数据图:


这里有一个使用熊猫做移动平均线的解决方案。首先
展开
数据(需要转换为弧度并返回),因此不存在不连续性(例如,从180跳到-179)。然后计算移动平均值,如果需要,最后转换回包装数据。另外,请使用
np.convalve()
检查此项

说你从

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, '+');

要执行循环卷积,可以执行以下操作:

yy = np.concatenate((y, y))
smoothed = np.convolve(np.array([1] * 5), yy)[5: len(x) + 5]
这在每个点使用前5个点(含)的循环平均值。当然,还有其他方法可以做到这一点

>>> plot(x, smoothed)

您可以从
scipy.signal
使用
convalve2d
。下面是一个函数,它将平滑应用于numpy数组
a
。如果
a
具有多个维度,则平滑将应用于最内层(最快)维度

import numpy as np
from scipy import signal

def cyclic_moving_av( a, n= 3, win_type= 'boxcar' ):
  window= signal.get_window( win_type, n, fftbins=False ).reshape( (1,n) )
  shp_a= a.shape
  b= signal.convolve2d( a.reshape( ( np.prod( shp_a[:-1], dtype=int ), shp_a[-1] ) ), 
                        window, boundary='wrap', mode='same' )
  return ( b / np.sum( window ) ).reshape( shp_a )
例如,它可以像

import matplotlib.pyplot as plt

x = np.linspace(0, 360, 360)
y1 = 5 * np.sin(x / 90. * 3.14) + 0.5 * np.random.randn(360)
y2 = 5 * np.cos(0.8 * x / 90. * 3.14) + 0.5 * np.random.randn(360)

y_av=  cyclic_moving_av( np.stack((y1,y2)), n=10 )  #1

plt.plot(x, y1, '+')
plt.plot(x, y2, '+')
plt.plot(x, y_av[0])
plt.plot(x, y_av[1])
plt.show()
这导致

第1行相当于

y_av[0]=  cyclic_moving_av( y1, n=10 )
y_av[1]=  cyclic_moving_av( y2, n=10 )

win\u type='boxcar'
会对权重相等的邻居进行平均。有关其他选项,请参阅。

您希望如何处理包裹?如果X从359度环绕到001度,Y值是否应与接近001度的其他数据平滑。?或者Y值是否应被视为处于361度。?类似地,您希望如何处理Y的环绕?问题是有两个数组X和Y,其中Y[i]是X[i]的函数。我以为我代表了时间。我的问题是,如果Y有一个序列看起来像[…,179,180,-179,-178,177,…]那么从字面上看它更有意义吗,或者像它包含[…,179,180,181,182,183,…]。与X类似。在我下面的回答中,我在平滑数据之前先“展开”数据。请注意,这不会处理
y
值中的环绕-但在这里这没关系,因为它们从未获得接近环绕点(+/-180)的值。我看不到平滑
X1
的意义。这是我的自变量。没有不确定性。在上面,您认为
X
Y
是时间的函数,但这不是正确的思考方式。就像我说的,
Y
X
的函数<代码>X是这里的时间替身。感谢您指出
np.unwrap
。我不知道。
y_av[0]=  cyclic_moving_av( y1, n=10 )
y_av[1]=  cyclic_moving_av( y2, n=10 )