Python中的滑动窗口

波莉

我在标记化文本文档的滑动窗口中使用了以下著名代码:

def window(fseq, window_size):
    "Sliding window"
    it = iter(fseq)
    result = tuple(islice(it, 0, window_size, round(window_size/4)))
    if len(result) == window_size:
        yield result
    for elem in it:
        result = result[1:] + (elem,)
        result_list = list(result)
        yield result_list

当我想调用窗口大小小于6的函数时,一切正常,但是当我增加它时,文本的开头将被剪切。

例如:

c=['A','B','C','D','E', 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
print(list(window(c, 4)))
print(list(window(c, 8)))

输出:

[('A', 'B', 'C', 'D'), ['B', 'C', 'D', 'E'], ['C', 'D', 'E', 'F'], ['D', 'E', 'F', 'G'], ['E', 'F', 'G', 'H'], ['F', 'G', 'H', 'I'],...

[['C', 'E', 'G', 'I'], ['E', 'G', 'I', 'J'], ['G', 'I', 'J', 'K'], ['I', 'J', 'K', 'L'], ['J', 'K', 'L', 'M']...

怎么了?为什么在第一个输出中第一个元素放在圆括号中?

我的预期输出print(list(window(c, 8)))是:

[['A','B','C', 'D', 'E', 'F','G','H'], ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], ['E', 'F', 'G', 'H', 'I', 'K', 'L', 'M']...
马丁·彼得斯(Martijn Pieters)

您的版本不正确。它将第4个参数(步长)添加到该islice()函数中,该参数限制所取第一个切片的大小

result = tuple(islice(it, 0, window_size, round(window_size/4)))

对于45round(window_size/4)产生1默认步长。但是对于较大的值,这将产生一个步长,以确保从第一个窗口中忽略这些值,因此len(result) == window_size可以保证下一个测试为假。

删除该步长参数,您将再次返回第一个窗口。另请参见Python中的滚动或滑动窗口迭代器

第一个结果在“圆括号”中,因为它是一个元组。如果您想要一个列表,请在代码中使用list()而不是tuple()

如果要让窗口以大于1的步长滑动,则不应更改初始窗口。您需要在step迭代过程中从窗口添加和删​​除大小元素。使用while循环更容易做到这一点

def window_with_larger_step(fseq, window_size):
    """Sliding window

    The step size the window moves over increases with the size of the window.
    """
    it = iter(fseq)
    result = list(islice(it, 0, window_size))
    if len(result) == window_size:
        yield result
    step_size = max(1, int(round(window_size / 4)))  # no smaller than 1
    while True:
        new_elements = list(islice(it, step_size))
        if len(new_elements) < step_size:
            break
        result = result[step_size:] + list(islice(it, step_size))
        yield result

这会将step_size元素添加到运行结果中,step_size从一开始就删除元素以保持窗口大小均匀。

演示:

>>> print(list(window_with_larger_step(c, 6)))
[['A', 'B', 'C', 'D', 'E', 'F'], ['C', 'D', 'E', 'F', 'I', 'J'], ['E', 'F', 'I', 'J', 'M', 'N'], ['I', 'J', 'M', 'N', 'Q', 'R'], ['M', 'N', 'Q', 'R', 'U', 'V'], ['Q', 'R', 'U', 'V', 'Y', 'Z']]
>>> print(list(window_with_larger_step(c, 8)))
[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'], ['C', 'D', 'E', 'F', 'G', 'H', 'K', 'L'], ['E', 'F', 'G', 'H', 'K', 'L', 'O', 'P'], ['G', 'H', 'K', 'L', 'O', 'P', 'S', 'T'], ['K', 'L', 'O', 'P', 'S', 'T', 'W', 'X'], ['O', 'P', 'S', 'T', 'W', 'X']]
>>> print(list(window_with_larger_step(c, 10)))
[['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], ['D', 'E', 'F', 'G', 'H', 'I', 'J', 'N', 'O', 'P'], ['G', 'H', 'I', 'J', 'N', 'O', 'P', 'T', 'U', 'V'], ['J', 'N', 'O', 'P', 'T', 'U', 'V', 'Z']]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python中的CSV文件(滑动窗口)

来自分类Dev

RxSwift 中的滑动窗口

来自分类Dev

如何突出显示图中的区域以指示Python中的滑动窗口?

来自分类Dev

python时间滑动窗口变化

来自分类Dev

Excel中的可变滑动窗口

来自分类Dev

python在滑动窗口上应用功能

来自分类Dev

功能编程中的滑动窗口匹配

来自分类Dev

在滑动窗口步骤中合并列

来自分类Dev

apache-flink:输出中的滑动窗口

来自分类Dev

R中的滑动归一化窗口

来自分类Dev

通过Python中的Pandas删除时间戳在上一个滑动窗口中的行

来自分类Dev

将滑动窗口设置为多维数组中的列(来自 MATLAB 的 IM2COL) - Python

来自分类Dev

Python + OpenCV,在滑动窗口外更改亮度/暗度?

来自分类Dev

在带有空格的python文本上滑动窗口?

来自分类Dev

Reactive Framework中的滑动窗口/缓冲区

来自分类Dev

使用在熊猫中滚动的滑动窗口迭代器

来自分类Dev

如何在Powershell中的数组上计算滑动窗口?

来自分类Dev

滑动libgdx中的弹出窗口不起作用

来自分类Dev

使用滑动窗口求和数据帧中的计数

来自分类Dev

BERT中的长文本滑动窗口,用于问答

来自分类Dev

在Apache Spark中没有水印的滑动窗口?

来自分类Dev

如何在Excel表格中创建滑动窗口?

来自分类Dev

neo4j中的滑动时间窗口查询

来自分类Dev

滑动libgdx中的弹出窗口不起作用

来自分类Dev

如何在 Azure Stream Analytics 中创建延迟滑动窗口

来自分类Dev

R:滚动/滑动窗口和R中滑动天数,以天为单位

来自分类Dev

循环滑动窗口迭代

来自分类Dev

蜂巢的总滑动窗口

来自分类Dev

数据框内的滑动窗口