这是一种使用向量化的方法broadcasting https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html -
N = 3 # Window size
nrows = a.size-N+1
a2D = a[np.arange(nrows)[:,None] + np.arange(N)]
out = a2D/a[:nrows,None].astype(float)
我们还可以使用NumPy strides https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html为了更有效地提取滑动窗口,就像这样 -
n = a.strides[0]
a2D = np.lib.stride_tricks.as_strided(a,shape=(nrows,N),strides=(n,n))
样本运行 -
In [73]: a
Out[73]: array([4, 9, 3, 6, 5, 7, 2])
In [74]: N = 3
...: nrows = a.size-N+1
...: a2D = a[np.arange(nrows)[:,None] + np.arange(N)]
...: out = a2D/a[:nrows,None].astype(float)
...:
In [75]: out
Out[75]:
array([[ 1. , 2.25 , 0.75 ],
[ 1. , 0.33333333, 0.66666667],
[ 1. , 2. , 1.66666667],
[ 1. , 0.83333333, 1.16666667],
[ 1. , 1.4 , 0.4 ]])