Линии вывода Python с повторяющимся значением в столбце - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть файл .txt, подобный этому

episode:2840  score:6.0  memory length:700345  epsilon:0.5576491831247304   steps:359    recent reward:5.95
episode:2841  score:4.0  memory length:700629  epsilon:0.5574965123606621   steps:284    recent reward:5.96
episode:2842  score:5.0  memory length:700911  epsilon:0.5573449596383373   steps:282    recent reward:5.93
Max lifes :5
episode:2800  score:7.0  memory length:687331  epsilon:0.5646918805492361   steps:268    recent reward:6.04
episode:2801  score:5.0  memory length:687678  epsilon:0.5645029051613243   steps:347    recent reward:6.03
episode:2802  score:6.0  memory length:688027  epsilon:0.564312906709082   steps:349    recent reward:6.03

Начиная с episode:0 и обновляя, но время от времени я вижу эту строку Max lifes :5, а затем некоторые эпизоды повторяются.Я хочу удалить строки, которые я вижу, эпизод снова появляется.Как я могу это сделать?Проблема в том, что повторяется только число episode, а не остальные столбцы.Так что для episode:2800 мы получаем другой счет, эпсилон и т. Д., Когда он появляется второй раз.Это то, что у меня пока есть:

import matplotlib.pyplot as plt
import os
import numpy as np
import pandas as pd
from itertools import islice


def next_1000_lines(file_opened, N):
    return [x.strip() for x in islice(file_opened, N)]



with open("ouput_10000.txt") as f:
    lines = f.readlines()

    x, y = [], []

    for line in lines:

        if line[:3] != "Max":
            x.append(line.split()[0])
            y.append(line.split()[7])
            x = next_1000_lines(x, 1000)
            y = next_1000_lines(y, 1000)

f.close()

print(x, y)

plt.plot(x,y)
plt.show()

Я хочу создать график reward для каждой 1000 episodes, эта функция next_1000_lines правильная?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я разделил проблему на части.Каждая точка эпизода / награды сохраняется в списках, если только номер эпизода не меньше, чем предыдущий.Теперь у вас должна быть возможность просмотреть список episodes и rewards, прежде чем строить его.После этого создается новый график для элементов 0..999, 1000..1999 и т. Д.

import matplotlib.pyplot as plt

# Read lines from file
filename = "ouput_10000.txt"
with open(filename) as f:
    lines = f.readlines()

# Extract episode/reward data points
episodes = []
rewards = []
for line in lines:
    if not line.startswith("episode"):
        # Not a line with episode/reward data
        continue
    columns = line.split()
    try:
        episode = int(columns[0].split(":")[1])
        reward = float(columns[7].split(":")[1])
    except:
        # Not a number
        continue
    if episode in episodes:
        # We don't want duplicate episodes
        continue
    episodes.append(episode)
    rewards.append(reward)

# Plot data
N = 1000
for i in range(int((len(episodes)-1)/N)+1):
    plt.plot(episodes[i*N:i*N+N], rewards[i*N:i*N+N])
    plt.savefig("plot{}.png".format(i))
    plt.close()
0 голосов
/ 10 декабря 2018

Похоже, что ваш метод next_1000_lines просто делает strip для содержимого x и y до 1000 элементов, и вы вызываете его в каждой строке.Почему бы просто не переходить по полосе, по одному разу в строке:

line_count = 0
for line in lines:

    if line[:3] != "Max":
        tokens = line.split()
        episode = int(tokens[0].split(':')[1])
        if episode not in x:
            reward = float(tokens[7].split(':')[1])
            x.append(episode)
            y.append(reward)
            line_count += 1
    if line_count == 1000:
        linePlot = plt.plot(x, y)
        plt.show()
        linePlot[0].figure.savefig(fileName)
        line_count = 0
        x = []
        y = []

На самом деле этот код не запускался, поэтому возможны ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...