我如何确保我的滑动 window 产生了正确数量的 windows?
How do I make sure that my sliding window is creating the right amount of windows?
谢谢!我从 here 修改了我的滑动 window 代码代码,但它仍然创建了一个比应有的少 window。
如果您想了解有关该问题的更多信息,我在那里写了有关初始问题的信息。简而言之,我正在处理一个大型文本文件,其中包含具有这种格式的 pi 的小数位。注意header全是数字,没有字符串。
我需要使用三个参数(window_size、step_size 和 last_windowstart)制作一个滑动 window 来裁剪文件。 last_windowstart 是最后一个 window 开始的地方。
有效,但应该是 238 windows 而不是 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)
您必须添加一个例外来处理余数。
假设您有 99 个 pi_digits,并且您希望每个文件中有 10 个 pi_digits (window_size)。但是既然有99个pi_digits,那么每个window中不可能有10个pi_digits。
前9个windows会有10个pi_digits,最后window有9个pi_digits。
这给了我们总共 10 个 windows,step_size 为 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)
谢谢!我从 here 修改了我的滑动 window 代码代码,但它仍然创建了一个比应有的少 window。
如果您想了解有关该问题的更多信息,我在那里写了有关初始问题的信息。简而言之,我正在处理一个大型文本文件,其中包含具有这种格式的 pi 的小数位。注意header全是数字,没有字符串。
我需要使用三个参数(window_size、step_size 和 last_windowstart)制作一个滑动 window 来裁剪文件。 last_windowstart 是最后一个 window 开始的地方。
有效,但应该是 238 windows 而不是 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)
您必须添加一个例外来处理余数。
假设您有 99 个 pi_digits,并且您希望每个文件中有 10 个 pi_digits (window_size)。但是既然有99个pi_digits,那么每个window中不可能有10个pi_digits。
前9个windows会有10个pi_digits,最后window有9个pi_digits。
这给了我们总共 10 个 windows,step_size 为 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)