Python:重复二维随机游走模拟

时间:2014-10-15 13:57:19

标签: python numpy random-walk

我正在模拟一个二维随机游走,方向0< θ< 2π和T = 1000步。我已经有了:

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次(每次使用新的随机种子),然后将每次运行保存在单独的文本文件中?我的randwalk函数中是否需要while循环?

猜测:

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 个答案:

答案 0 :(得分:2)

您不需要任何显式循环。整个解决方案可以进行矢量化(未经测试):

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)))

答案 1 :(得分: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)

答案 2 :(得分: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)

对于基本计算,panda-34和NPE的答案也很好,并利用numpy的矢量化。

在这里,我使用seed(j)显式设置种子随机数。这样做的好处是,只要种子是相同的,每个结果都是可重复的,即使它们不按顺序运行,或者你改变了数组长度等等。这不是必要的,尽管如果没有不想重复运行 - 然后随机只会从时间开始播种,所有运行中的所有随机数都会不同。

文件名说明:由于OP要求将多次运行中的每次运行保存到不同的文件,我认为有编号的文件会很好,例如my_random_walk_0.txtmy_random_walk_1.txt等。在我的示例我使用名称fn_base作为变量来保存文件名的一般格式,例如,代码fn = fn_base % 17fn设置为等于my_random_walk_17.txt(这是python的一个老派,请阅读python中的“字符串格式”以获取更多信息。)