2014-10-15 2 views
2

Я имитирую двумерное случайное блуждание с направлением 0 < θ < 2π и T = 1000 шагов. У меня уже есть:Python: Повторение двухмерного моделирования случайного блуждания

a=np.zeros((1000,2), dtype=np.float) 

def randwalk(x,y): 
    theta=2*math.pi*rd.rand() # Theta is a random angle between 0 and 2pi 
    x+=math.cos(theta);   # Since spatial unit = 1 
    y+=math.sin(theta);   # Since spatial unit = 1 
    return (x,y) 

x, y = 0., 0. 
for i in range(1000): 
    x, y = randwalk(x,y) 
    a[i,:] = x, y 

Это генерирует одну прогулку и сохраняет все промежуточные координаты в массиве numpy a. Как я могу отредактировать свой код, чтобы повторить прогулку 12 раз (используя каждое новое случайное семя каждый раз), а затем сохранить каждый прогон в отдельном текстовом файле? Нужен ли мне цикл while в моей функции randwalk?

Guess:

rwalkrepeat = [] 

for _ in range(12): 
    a=np.zeros((1000,2), dtype=np.float) 
    x, y = 0., 0. 
    for i in range(1000): 
     x, y = randwalk(x,y) 
     a[i,:] = x, y 

rwalkrepeat.append(a) 

print rwalkrepeat 
+3

Чтобы повторить вышеуказанные 12 раз, для цикла вокруг того, что у вас уже есть, будет хорошо работать. – mdurant

+0

Вы должны попытаться решить больше этого самостоятельно, прежде чем отправлять вопросы. Вы говорите: «Мне нужен цикл while», и лучшим ответом на это является попытка заставить его работать с циклом while. Кроме того, попробуйте заставить его работать с циклом 'for', так как вы тоже об этом знаете. Сохранить как текст ?, google «numpy save as text» и посмотреть, что вы получаете. Первый хит - это «numpy.savetxt», а второй - «numpy input and output». – tom10

+0

@ tom10 Я добавил гадание к сообщению. Я на правильных линиях? –

ответ

0

Подход к этому, который прилипает с общей формой вашего кода:

import numpy as np 
import matplotlib.pyplot as plt 
import random as rd 
import math 

a=np.zeros((1000,2), dtype=np.float) 

def randwalk(x,y): 
    theta=2*math.pi*rd.random() 
    x+=math.cos(theta);   
    y+=math.sin(theta);   
    return (x,y) 

fn_base = "my_random_walk_%i.txt" 
for j in range(12): 
    rd.seed(j) 
    x, y = 0., 0. 
    for i in range(1000): 
     x, y = randwalk(x,y) 
     a[i,:] = x, y 
    fn = fn_base % j 
    np.savetxt(fn, a) 

Для основного расчета, панда-34 и ответы НЭП также хороши и используют векторизацию numpy.

Здесь я использовал seed(j), чтобы явно задавать семена случайными числами. Преимущество этого заключается в том, что каждый результат будет повторяться до тех пор, пока семя будет одинаковым, даже если, скажем, они не будут выполняться последовательно или вы измените длину массива и т. Д. Это не обязательно, 't хочу повторяемые прогоны - тогда случайный будет просто семя от времени, и все случайные числа во всех прогонах будут разными.

Объяснения для имен файлов: поскольку OP просил сохранения каждому из нескольких прогонов в разные файлы, я подумал, что было бы хорошо иметь пронумерованные файлы, например, здесь my_random_walk_0.txt, my_random_walk_1.txt и т.д. В моем примере я использовал имя fn_base, как переменную для хранения общего формата имени файла, так что, скажем, код fn = fn_base % 17 установил бы fn равным my_random_walk_17.txt (это немного старая школа для python, более подробно о «форматировании строк» ​​в python для более).

+0

Спасибо, это отлично работает. Как вы, вероятно, можете сказать, что я очень неопытен с Python, что такое fn и fn_base? –

+0

Я добавил объяснение в конце моего ответа. – tom10

0

Если вы используете NumPy, почему вы не используете NumPy? я бы сделал это так:

n_moves = 1000 
a = np.zeros((n_moves, 2)) 

for i in range(12): 
    thetas = (2*np.pi) * np.random.rand(n_moves-1) 
    a[1:,0] = np.cos(thetas) 
    a[1:,1] = np.sin(thetas) 
    a = np.add.accumulate(a, 0) 
1

Вам не нужны какие-либо явные петли. Весь раствор может быть векторизации (непроверенные):

nsteps = 1000 
nwalks = 12 
theta = 2 * np.pi * np.random.rand(nwalks, nsteps - 1) 
xy = np.dstack((np.cos(theta), np.sin(theta))) 
a = np.hstack((np.zeros((nwalks, 1, 2)), np.cumsum(xy, axis=1))) 
Смежные вопросы