【问题标题】:How do I make sure that my sliding window is creating the right amount of windows?如何确保我的滑动窗口正在创建正确数量的窗口?
【发布时间】:2016-04-21 04:48:45
【问题描述】:

谢谢!我从here 修改了我的滑动窗口代码,但它仍然比应有的少一个窗口。

如果您想了解有关该问题的更多信息,我在那里写了有关最初问题的信息。简而言之,我正在处理一个包含这种格式的 pi 小数位的大文本文件。注意头部全是数字,没有字符串。

我需要制作一个使用三个参数(window_size、step_size 和 last_windowstart)裁剪文件的滑动窗口。 last_windowstart 是最后一个窗口开始的地方。

它可以工作,但应该有 238 个窗口而不是 237 个。

我知道 lastcounter 工作正常,但我不确定 lastwindow_start。我试过改变它的值,这绝对是问题的一部分。

Xrange 也是问题的一部分

对sliding_window 或lastwindow_start 有什么想法吗?

inputFileName = "sample.txt"

import itertools
import linecache

def sliding_window(window_size, step_size, lastwindow_start):
    for i in xrange(0, lastwindow_start, step_size):
        yield (i, i + window_size)

def PiCrop(window_size, step_size):

f = open(inputFileName, 'r')

first_line = f.readline().split()

Total_Pi_Digits = int(first_line[0])

lastwindow_start = Total_Pi_Digits-(Total_Pi_Digits%window_size)

lastcounter = (Total_Pi_Digits//window_size)*(window_size/step_size)

flags = [False for i in range(lastcounter)]

first_line[0] = str(window_size)
second_line = f.readline().split()
offset = int(round(float(second_line[0].strip('\n'))))
first_line = " ".join(first_line)

f. close()

with open(inputFileName, 'r') as f:
    header = f.readline()
    data = [line.strip().split(',') for line in f.readlines()]

    for counter, window in enumerate(sliding_window(window_size,step_size,lastwindow_start)):
        chunk = data[window[0]:window[1]]

        with open('PiCrop_{}.txt'.format(counter), 'w') as output:

            if (flags[counter] == False):
                flags[counter] = True

                headerline = float(linecache.getline(inputFileName, window[1]+1)) - offset
                output.write(str(window_size) + " " + str("{0:.4f}".format(headerline)) + " " + 'L' + '\n')

            for item in chunk:
                newline = str("{0:.4f}".format(float(str(item).translate(None, "[]'"))-offset))
                output.write(str(newline) + '\n')

PiCrop(1000,500)

【问题讨论】:

    标签: python text iterator full-text-search sliding-window


    【解决方案1】:

    你必须添加一个异常来处理剩余部分。

    假设您有 99 个 pi_digits,并且您希望每个文件中有 10 个 pi_digits(window_size)。但是由于有 99 个 pi_digits,每个窗口中不可能有 10 个 pi_digits。

    前 9 个窗口有 10 个 pi_digits,最后一个窗口有 9 个 pi_digits。

    这给了我们总共 10 个步长为 0 的窗口。 由于没有 step_size,我们需要将其纳入程序中。

    让我们使用 5 的 step_size。这每次都会向上移动 5 配对如下:

    • (0, 10)
    • (5, 15)
    • (10, 20)
    • (15, 25)
    • (20, 30)
    • (25, 35)
    • (30, 40)
    • (35, 45)
    • (40, 50)
    • (45, 55)
    • (50, 60)
    • (55, 65)
    • (60, 70)
    • (65, 75)
    • (70, 80)
    • (75, 85)
    • (80, 90)
    • (85, 95)
    • (90,99)

    注意最后一对是 (90,99)。这打破了模式。

    所以我们添加以下行'yield(lastwindow_start,total_pi_digits)'来添加最后一对,whi

    def sliding_window(window_size, step_size, lastwindow_start,total_pi_digits):
        for i in xrange(0, lastwindow_start, step_size):
            yield (i, i + window_size)
    yield (lastwindow_start, total_pi_digits)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2021-05-23
      • 2012-04-24
      • 1970-01-01
      • 2015-02-05
      相关资源
      最近更新 更多