Могу ли я хранить данные из for-l oop как разные переменные для каждой итерации? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть функция, которая создает набор результатов в списке. Это в for -l oop, который меняет одну из переменных в каждой итерации. Мне нужно иметь возможность хранить эти списки отдельно, чтобы я мог показать разницу в результатах для каждой итерации в виде графика.

Есть ли способ хранить их отдельно, как это? Пока единственное решение, которое я нашел, - это скопировать функцию несколько раз и вручную изменить переменную и имя списка, в котором она хранится, но, очевидно, это ужасный способ сделать это, и я считаю, что должен быть правильный путь. .

Вот код. Функция грязная, но работает. В идеале я мог бы поместить все это в другую for -l oop, которая изменяет deceleration_p каждую итерацию, а затем сохраняет collected_averages как отдельный список, чтобы я мог сравнить collected_averages для каждой итерации.

import numpy as np
import random
import matplotlib.pyplot as plt
from statistics import mean

road_length = 500
deceleration_p = 0.1
max_speed = 5
buffer_road = np.zeros(road_length, dtype=int)
buffer_speed = 0
number_of_iterations = 1000
average_speed = 0
average_speed_list = []
collected_averages = []
total_speed = 0

for cars in range(1, road_length):
    empty_road = np.ones(road_length - cars, dtype=int) * -1
    cars_on_road = np.ones(cars, dtype=int)
    road = np.append(empty_road, cars_on_road)
    np.random.shuffle(road)
    for i in range(0, number_of_iterations):
        # acceleration
        for speed in np.nditer(road, op_flags=['readwrite']):
            if -1 < speed < max_speed:
                speed[...] += 1
        # randomisation
        for speed in np.nditer(road, op_flags=['readwrite']):
            if 0 < speed:
                if deceleration_p > random.random():
                    speed += -1
        # slowing down
        for cell in range(0, road_length):
            speed = road[cell]
            for val in range(1, speed + 1):
                new_speed = val
                if (cell + val) > (road_length - 1):
                    val += -road_length
                if road[cell + val] > -1:
                    speed = val - 1
                    road[cell] = new_speed - 1
                    break
        buffer_road=np.ones(road_length, dtype=int)*-1
        for cell in range(0, road_length):
            speed = road[cell]
            buffer_cell = cell + speed
            if (buffer_cell) > (road_length - 1):
                buffer_cell += -road_length
            if speed > -1:
                total_speed += speed
                buffer_road[buffer_cell] = speed
        road = buffer_road
        average_speed = total_speed/cars
        average_speed_list.append(average_speed)
        average_speed = 0
        total_speed = 0
    steady_state_average=mean(average_speed_list[9:number_of_iterations])
    average_speed_list=[]
    collected_averages.append(steady_state_average)

1 Ответ

0 голосов
/ 07 апреля 2020

Не в моих силах. Как указано в комментариях, вы можете использовать словарь, но я предлагаю использовать список. Для каждой итерации l oop вы можете добавить значение. (Из того, что я понял) Вы заявили, что ваши результаты находятся в списке, чтобы вы могли создать 2D-массив. Я рекомендую использовать массив numpy, так как он намного быстрее. Надеюсь, это было полезно.

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