4

方向が 0 < θ < 2π で、T=1000 ステップの 2 次元ランダム ウォークをシミュレートしています。私は既に持っています:

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
4

3 に答える 3

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)、シードに乱数を明示的に設定していました。これの利点は、シードが同じである限り、たとえ順番に実行されなかったり、配列の長さを変更したりしても、各結果が繰り返し可能であることです。 '繰り返し可能な実行が必要ない場合-ランダムは時間からシードされるだけで、すべての実行中のすべての乱数は異なります。

my_random_walk_0.txtファイル名の説明: OP は、複数の実行のそれぞれを異なるファイルに保存するように要求したので、番号付きのファイル (たとえば、ここに、 など) があるとよいと考えましたmy_random_walk_1.txt。私の例では、名前fn_baseを変数として使用して一般的な形式を保持しました。たとえば、コードfn = fn_base % 17は次のように設定さfnれますmy_random_walk_17.txt(これは Python の古い学校です。詳細については、Python の「文字列の書式設定」についてお読みください)。

于 2014-10-15T17:50:32.673 に答える
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)
于 2014-10-15T14:49:37.983 に答える