我正在模拟一个二维随机游走,方向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
答案 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.txt
,my_random_walk_1.txt
等。在我的示例我使用名称fn_base
作为变量来保存文件名的一般格式,例如,代码fn = fn_base % 17
将fn
设置为等于my_random_walk_17.txt
(这是python的一个老派,请阅读python中的“字符串格式”以获取更多信息。)