为了账号安全,请及时绑定邮箱和手机立即绑定

在 python 中创建翻滚的窗口

在 python 中创建翻滚的窗口

米琪卡哇伊 2022-09-20 15:39:08
只是想知道是否有一种方法可以在python中构建一个翻滚的窗口。例如,如果我有列表/ndarray ,.然后我怎么能找到前3个项目(3,2,5)的最大数量 - >5,然后接下来的3个项目(9,4,6) - >9,依此类推......有点像把它分成几部分,找到最大值。所以最终结果将是列表listA = [3,2,5,9,4,6,3,8,7,9][5,9,8,9]
查看完整描述

3 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

方法#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 soln

In [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#1

In [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#2

In [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)


查看完整回答
反对 回复 2022-09-20
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

使用 numpy,您可以使用零扩展列表,使其长度可被窗口大小整除,并沿第二个轴重新调整和计算:max


def 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])


查看完整回答
反对 回复 2022-09-20
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

如果你想要一个单行,你可以使用列表理解:


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


查看完整回答
反对 回复 2022-09-20
  • 3 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信