如何确保我的滑动窗口正在创建适量的窗口?

时间:2016-01-15 14:48:11

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

谢谢!我从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)

1 个答案:

答案 0 :(得分:0)

你必须添加一个例外来处理余数。

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

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

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

让我们使用step_size为5.每次将该对向上移动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)