喵喵时光机
方法#1:单行,用于窗口化最大值,使用 np.最大值。. -In [118]: np.maximum.reduceat(listA,np.arange(0,len(listA),3))Out[118]: array([5, 9, 8, 9])变得更紧凑np.r_ -np.maximum.reduceat(listA,np.r_[:len(listA):3])方法#2:通用的 ufunc 方式这是一个用于通用 ufunc 的函数,该窗口长度作为参数 -def windowed_ufunc(a, ufunc, W): a = np.asarray(a) n = len(a) L = W*(n//W) out = ufunc(a[:L].reshape(-1,W),axis=1) if n>L: out = np.hstack((out, ufunc(a[L:]))) return out示例运行 -In [81]: a = [3,2,5,9,4,6,3,8,7,9]In [82]: windowed_ufunc(a, ufunc=np.max, W=3)Out[82]: array([5, 9, 8, 9])在其他问题上 -In [83]: windowed_ufunc(a, ufunc=np.min, W=3)Out[83]: array([2, 4, 3, 9])In [84]: windowed_ufunc(a, ufunc=np.sum, W=3)Out[84]: array([10, 19, 18, 9])In [85]: windowed_ufunc(a, ufunc=np.mean, W=3)Out[85]: array([3.33333333, 6.33333333, 6. , 9. ])标杆对阵列数据的 NumPy 解决方案进行计时,样本数据按以下方式纵向扩展10000x -In [159]: a = [3,2,5,9,4,6,3,8,7,9]In [160]: a = np.tile(a, 10000)# @yatu's solnIn [162]: %timeit moving_maxima(a, w=3)435 µs ± 8.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)# From this post - app#1In [167]: %timeit np.maximum.reduceat(a,np.arange(0,len(a),3))353 µs ± 2.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)# From this post - app#2In [165]: %timeit windowed_ufunc(a, ufunc=np.max, W=3)379 µs ± 6.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
明月笑刀无情
使用 numpy,您可以使用零扩展列表,使其长度可被窗口大小整除,并沿第二个轴重新调整和计算:maxdef moving_maxima(a, w): mod = len(a)%w d = w if mod else mod x = np.r_[a, [0]*(d-mod)] return x.reshape(-1,w).max(1)一些例子:moving_maxima(listA,2)# array([3., 9., 6., 8., 9.])moving_maxima(listA,3)#array([5, 9, 8, 9])moving_maxima(listA,4)#array([9, 8, 9])
神不在的星期二
如果你想要一个单行,你可以使用列表理解:listA = [3,2,5,9,4,6,3,8,7,9]listB=[max(listA[i:i+3]) for i in range(0,len(listA),3)]print (listB)它返回:[5, 9, 8, 9]当然,代码可以更动态地编写:如果你想要不同的窗口大小,只需更改为任何整数。3