我正在模拟一个二维随机游走,方向0< θ< 2π和T = 1000步。我已经有一个模拟单步行的代码,重复12次,并将每次运行保存到顺序命名的文本文件中:
a=np.zeros((1000,2), dtype=np.float)
print a # Prints array with zeros as entries
# Single random walk
def randwalk(x,y): # Defines the randwalk function
theta=2*math.pi*rd.rand()
x+=math.cos(theta);
y+=math.sin(theta);
return (x,y) # Function returns new (x,y) coordinates
x, y = 0., 0. # Starting point is the origin
for i in range(1000): # Walk contains 1000 steps
x, y = randwalk(x,y)
a[i,:] = x, y # Replaces entries of a with (x,y) coordinates
# Repeating random walk 12 times
fn_base = "random_walk_%i.txt" # Saves each run to sequentially named .txt
for j in range(12):
rd.seed() # Uses different random seed for every run
x, y = 0., 0.
for i in range(1000):
x, y = randwalk(x,y)
a[i,:] = x, y
fn = fn_base % j # Allocates fn to the numbered file
np.savetxt(fn, a) # Saves run data to appropriate text file
现在我想计算所有12个步行的均方位移。为此,我最初的想法是将每个文本文件中的数据导回到一个numpy数组中,例如:
infile="random_walk_0.txt"
rw0dat=np.genfromtxt(infile)
print rw0dat
然后以某种方式操纵数组以找到均方位移。
有没有更有效的方法来找到我拥有的MSD?
答案 0 :(得分:2)
这是一个快速的snipet来计算均方位移(MSD)。 在路径由时间上等间隔的点构成的情况下,似乎是这种情况 为你的randwalk。您可以放置在12-walk for循环中并为每个[i,:]
计算它#input path =[ [x1,y1], ... ,[xn,yn] ].
def compute_MSD(path):
totalsize=len(path)
msd=[]
for i in range(totalsize-1):
j=i+1
msd.append(np.sum((path[0:-j]-path[j::])**2)/float(totalsize-j))
msd=np.array(msd)
return msd
答案 1 :(得分:0)
首先,您实际上并不需要存储整个1000步行走,只需要存储最终位置。
此外,没有理由将它们存储到文本文件并加载它们,您可以在内存中使用它们 - 只需将它们放在数组列表中,或者放在另外1个维度的数组中。即使您需要将它们写出来,您也可以以及保留最终值,而不是代替。 (另外,如果您在构建2D数组时没有实际使用numpy
来提高性能或简单性,那么您可能需要考虑迭代地构建它,例如,使用csv
模块,但更多的是判断电话。)
无论如何,给定12个最终位置,你只需计算每个位置与(0, 0)
之间的距离,然后将它们平方,将它们全部加起来,然后除以12.(或者,因为显而易见的计算方法与(0, 0)
的距离只是添加x
和y
位置的方块,然后对结果进行平方根,只需跳过末端的平方根和正方形。)
但是如果你希望出于某种原因将每个整个步行存储到一个文件中,那么在你加载它们之后,walk[-1]
会给你最终位置作为1D数组2值。因此,您可以将这12个最终位置读取到12x2阵列中并向量化均方距离,或者只是将它们累积在列表中并手动执行。
虽然我们处于此状态,但rd.seed()
并非必要; PRNG的重点是你继续获得不同的数字,除非你明确地将种子重置为其原始值以重复它们。
这是一个放弃两个额外复杂性并直接做所有事情的例子:
destinations = np.zeros((12, 2), dtype=np.float)
for j in range(12):
x, y = 0., 0.
for i in range(1000):
x, y = randwalk(x, y)
destinations[j] = x, y
square_distances = destinations[:,0] ** 2 + destinations[:,1] ** 2
mean_square_distance = np.mean(square_distances)