Сбор результатов из цикла, который возвращает массивы NumPy - PullRequest
7 голосов
/ 24 ноября 2011

Я, по общему признанию, довольно простой программист на Python, пытаюсь учиться, сталкиваясь с проблемами при реализации различных исследовательских задач.И я столкнулся с одной из этих проблем - в частности, с тем, как обрабатывать циклы, когда я возвращаю кучу данных, а не с обычными примерами «из одного числа получается», где вы просто добавляете результат цикла ко всем предыдущим.

Вот суть unlooped-скрипта, который я пытаюсь запустить: https://gist.github.com/1390355

Действительно существенным моментом является конец функции model_solve:

def model_solve(t):
    # lots of variables set
    params = np.zeroes((n_steps,n_params)
    params[:,0] = beta
    params[:,1] = gamma
    timer = np.arange(n_steps).reshape(n_steps,1)
    SIR = spi.odeint(eq_system, startPop, t_interval)
    output = np.hstack((timer,SIR,params))
    return output

Это возвращает результаты бита интеграции ODE (spi.odeint) вместе с простым «На каком временном шаге мы находимся?»таймер и, по существу, два столбца значения двух случайных переменных, повторенных много-много раз в виде массива NumPy из 4950 строк и 7 столбцов.бета и гамма), которые имеют случайные значения.По сути, я хочу сделать функцию, которая будет выглядеть примерно так:

def loop_function(runs):
  for i in range(runs):
    model_solve(100)
    # output of those model_solves collected here
  # return collected output

Этот собранный вывод будет записан в файл.Обычно, я просто хотел бы, чтобы каждая функция model_solve записывала свои результаты в файл, но этот код будет запускаться на PiCloud или другой платформе, где у меня не обязательно есть возможность записать файл дорезультаты возвращаются на локальную машину.Вместо этого я пытаюсь получить возврат огромного массива NumPy runs* 7 столбцов и 4950 строк - который затем можно записать в файл на моем локальном компьютере.

Любые подсказки относительно того, какподойти к этому?

Ответы [ 2 ]

11 голосов
/ 24 ноября 2011

используйте список для сохранения всех результатов:

results = []
for i in range(runs):
    results.append(model_solve(100))

, затем получите выходной массив по:

np.hstack(results)
9 голосов
/ 24 ноября 2011

На самом деле, если ваш код имеет гораздо больший цикл, вы всегда должны пытаться векторизовать вашу проблему. Если скорость важна, вы должны знать, что «петли» - это горлышко бутылки. Кроме того, операция добавления очень медленная и требует больше памяти, поскольку создает копии. Итак, лучшее решение должно быть:

results = [0]*runs # if you want to use lists...

[model_solve(100) for x in results] # do see list comprehension in python 

Помимо использования списка, вы также можете напрямую использовать массив для хранения ваших результатов:

resutls=np.zeros([numberOfRuns,ShapeOfModelResults])

for i in range(numberOfRuns):
    results[numberOfRuns,modelSolve(100)] # this will put the result directly in the matrix

Надеюсь, мой ответ поможет вам быстрее и понятнее написать код

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