将数组与其差异对齐

时间:2015-11-29 16:11:05

标签: python alignment diff

我想使用数组及其一阶导数(diff)作为训练功能。由于diff阵列的尺寸较小,我想填充它,以便在堆叠它们并将它们用作特征时我没有尺寸问题。

如果我用0填充diff(数组),我应该如何对齐它们?我是将0放在生成的diff(数组)的开头还是结尾处?将数组与其导数对齐的正确方法是什么?例如在python:

a  = [1,32,43,54]
b = np.diff(np.array(a))

np.insert(b, -1, 0) # at the end?
np.insert(b, 0, 0) # or at the beginning?

2 个答案:

答案 0 :(得分:1)

代替左侧或右侧的有限差分,您可以使用居中的有限差分(相当于取左侧和右侧差异的平均值),然后使用适当的近似值填充两端。衍生物那里。这将使导数的估计与其数据值保持一致,并且通常可以更好地估计导数。

例如,

In [33]: y = np.array([1, 2, 3.5, 3.5, 4, 3, 2.5, 1.25])

In [34]: dy = np.empty(len(y))

In [35]: dy[1:-1] = 0.5*(y[2:] - y[:-2])

In [36]: dy[0] = y[1] - y[0]

In [37]: dy[-1] = y[-1] - y[-2]

In [38]: dy
Out[38]: array([ 1.   ,  1.25 ,  0.75 ,  0.25 , -0.25 , -0.75 , -0.875, -1.25 ])

以下脚本使用matplotlib创建衍生物估计的可视化:

plot

import numpy as np
import matplotlib.pyplot as plt

y = np.array([1, 2, 3.5, 3.5, 4, 3, 2.5, 1.25])
dy = np.empty(len(y))
dy[1:-1] = 0.5*(y[2:] - y[:-2])
dy[0] = y[1] - y[0]
dy[-1] = y[-1] - y[-2]


plt.plot(y, 'b-o')
for k, (y0, dy0) in enumerate(zip(y, dy)):
    t = 0.25
    plt.plot([k-t, k+t], [y0 - t*dy0, y0 + t*dy0], 'c', alpha=0.4, linewidth=4)

plt.grid()
plt.show()

有更复杂的工具来估算衍生工具(例如scipy.signal.savgol_filter有一个估算衍生工具的选项,如果你的数据是周期性的,你可以使用scipy.fftpack.diff),但是一个简单的有限差分可能有效很好的培训输入。

答案 1 :(得分:1)

根据documentation,差异只是做out[n] = a[n+1] - a[n]。这意味着它不是由有限差分近似的导数,而是离散差。要计算有限差分,您需要除以步长, 当然,除非您的步长为1。例如:

import numpy as np
x = np.linspace(0,2*np.pi,30)
y = np.sin(x)
dy = np.diff(y) / np.diff(x)  

此处,yx在特定点的函数,dy是它的派生。该公式的导数是中心导数,意味着它的位置在x中的点之间。如果您需要相同点的导数,我建议您使用两个相邻点来计算导数:

(y[:-2]-y[2:])/(x[:-2]-x[2:])

这样,您可以在导数向量的两边添加0,或相应地修剪输入向量。