2016-01-15 4 views
0

Спасибо! Я изменил код скользящего окна с 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) 

ответ

0

Вы должны добавить исключение для обработки остатка.

Скажем, у вас есть 99 pi_digits и вы хотите 10 pi_digits в каждом файле (window_size). Но так как в каждом окне есть 99 pi_digits, в каждом окне не должно быть 10 pi_digits.

В первых 9 окнах и 9 pi_digits в последнем окне будет 10 pi_digits.

Это дает нам в общей сложности 10 окон с шагом_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). Это нарушает шаблон.

Таким образом, мы добавим следующую строку 'выход (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)