【发布时间】:2016-03-18 17:59:15
【问题描述】:
我正在处理一个大文本文件,其中包含具有这种格式的 pi 的小数位。注意头部全是数字,没有字符串。
标题格式:Number_of_sequences Total_Pi_Digits File_Version_Number
550 10000 5
*Pi Sequence Part 1
1415926535897932384
*Pi Sequence Part 2
6264338327950288419
*Pi Sequence Part 3
1693993751058209749
我需要制作一个使用三个参数(window_size、step_size 和 last_windowstart)裁剪文件的滑动窗口。 last_windowstart 是最后一个窗口开始的地方。
文件数由 Total_Pi_Digits 除以窗口来确定。
如果文件有 99 个 Total_Pi_Digits,window_size 为 10,step_size 为零,则从 99//10=10 和 99%10 将 9 个窗口留在窗口 11 中总共有 11 个窗口。
lastwindow_start 应该是 90 我猜这个例子。我不确定我是否需要 last_window 启动。
对于每个窗口,将创建一个名为 PiSubsection# 的文件 其中 # 是窗口编号。
对于每个文件,每个窗口都应该有相同的新标题,其中 Number_of_sequences Total_Pi_Digits File_Version_Number 是标题格式。
Number_of_sequences Total_Pi_Digits 将根据 window_size 和 step_size 而改变,但 File_Version_Number 不得改变。
我的问题是我的滑动窗口算法没有考虑到 0 的 step_size 并且它没有产生正确数量的文件。 到目前为止,它产生了两倍的文件,我不知道为什么。
此外,我也不确定是否理解滑动窗口算法中窗口数量的数学运算。
如何修复我的滑动窗口算法以接受 0 的 step_size 并生成适量的输出文件?
inputFileName = example.txt
import shlex
def sliding_window(windows_size, step_size, lastwindow_start):
for i in xrange(0, lastwindow_start, step_size):
yield (i, i + windows_size)
def PiCrop(windows_size, step_size):
with open(inputFileName, 'r') as input:
first_line = shlex.split(input.readline().strip())
PiNumber = int(first_line[1])
lastwindow_start = PiNumber-(PiNumber%windows_size)
flags = [False for i in range(lastwindow_start)]
first_line[1] = str(windows_size * int(first_line[0]))
first_line = " ".join(first_line)
for line in input:
if line.startswith(first_line[0]):
pass
elif line.startswith('*'):
Indiv = line
else:
for counter, window in enumerate(sliding_window(windows_size,step_size,lastwindow_start)):
newline = line[window[0]:window[1]]
with open('PiSection{}.txt'.format(counter), 'a') as output:
if (flags[counter] == False):
flags[counter] = True
output.write(first_line + '\n')
output.write(Indiv)
output.write(newline + '\n')
【问题讨论】:
-
你的滑动窗口的概念和这里描述的一样吗? stackoverflow.com/questions/8269916/… 另外,在我看来,步长必须至少为 1,否则算法将保持在同一索引上?
-
是的。这就是我感到困惑的地方。问题是它确实创建了正确数量的文件。
标签: python algorithm text range sliding-window