これは、numpy配列のみを使用したランダムウォーク問題のバージョンです。位置が500ステップにわたって再訪される時間を見つけるには、位置のソートされた配列をそのオフセットと比較し、0に近い時間を記録してから、オフセットを増やす必要があります。
これまでの私のコードは次のとおりです。問題は「while」ループにあり、位置が「zeroArray」の要素として再訪される最終的な回数を保存しようとしています。
実行すると、インデックスエラーが発生し、結果が記録されず、ループを停止するブール式が変更されたにもかかわらず、何度も繰り返されたカウンターが発生します。
編集:numpy配列で繰り返し位置を見つける方法:1)最終的な位置配列を昇順で並べ替えます。2)オフセットを増やしながらスライスを比較します。ただし、そのオフセットで0.001m以内の位置を見つけます。つまり、位置を隣接する位置と比較します(オフセット1)。あなたは隣人が2つのスペースであなたがたった2つのケースを見つけるかもしれないと計算する18のケースを見つけるかもしれません。そして、3つのスペースで0が見つかり、その時点で停止します。
import numpy as np
import random
MAX_STEP_SIZE = 0.90 # maximum size of a single step [m]
NUM_STEPS = 500 # number of steps in a random walk []
NUM_WALKS = 10 # number of random walks in a run []
TOLERANCE = 0.001 # separation of points considered the same [m]
STEP_TO_RECORD_1 = 100 # first step to record and analyze []
STEP_TO_RECORD_2 = 500 # 2nd step to record and analyze []
random.seed(12345)
#......................................................................distance
def distance(posA, posB) :
"""Distance between two positions"""
return np.abs(posA - posB)
#...............................................................initialPosition
def initialPosition() :
"""Initial position of walker at the start of a random walk"""
return 0.0
def genPositions(nSteps, maxStep) :
"""Return the new position after a random step between -maxStep and
maxStep, given the previous position"""
genArray1 = (maxStep - (-maxStep))*(np.random.random(nSteps+1)) + (-maxStep)
genArray1[0]=initialPosition()
return np.cumsum(genArray1)
oneStep = np.zeros(NUM_WALKS)
fiveStep = np.zeros(NUM_WALKS)
zeroStep = np.zeros(NUM_WALKS)
walkArray = np.zeros(NUM_WALKS)
counter = 1
hitcounter = 0
zerocounter = 0
keepchecking = bool(1)
for ii in range(NUM_WALKS):
position = (genPositions(NUM_STEPS, MAX_STEP_SIZE))
oneStep[ii] = position[100]
fiveStep[ii] = position[-1]
zeroArray = np.sort(position)
while keepchecking == bool(1):
zerocounter = 0
for jj in range(len(zeroArray)):
hitcounter = 0
if distance(zeroArray[jj+counter], zeroArray[jj]) <= TOLERANCE:
hitcounter +=1
zerocounter += hitcounter
counter +=1
if hitcounter == 0:
keepchecking = bool(0)
zeroStep[ii] = zerocounter
助けてくれてありがとう、