2013-03-20 3 views
2

이것은 numpy 배열만을 사용하는 임의 walk 문제의 버전입니다. 위치가 500 단계 이상 재검색 된 시간을 찾으려면 정렬 된 정렬 된 배열을 오프셋과 비교해야하며 0에 가까운 시간을 기록한 다음 오프셋을 증가시켜야합니다. 여기 Numpy 배열은 2 개의 배열 요소를 지표의 증가하는 오프셋과 비교하여 비교합니다.

문제가에 지금까지 내 코드 년대 나는 시간의 최종 금액 위치가 요소로 재 방문한다를 저장하기 위해 노력하고있어 어디 루프 '동안'은 'zeroArray'

나는 그것을 실행 루프에 대한 부울 표현식이 변경 되었더라도 인덱스 오류가 발생하고 결과가 기록되지 않고 반복 횟수가 너무 많은 카운터가 너무 많습니다.

편집 : numpy 배열로 반복 위치를 찾는 방법 : 1) 최종 위치 배열을 증가 순서로 정렬하십시오. 2) 이웃 오프셋 (offset 1)과 위치를 비교하는 해당 오프셋 인 에서 0.001m 이내의 위치를 ​​찾으면 슬라이스와 오프셋을 비교하십시오. 당신은 이웃 사람들이 두 공간에서 당신이 단지 2 가지 사례를 찾을 수 있다고 계산 한 18 가지 사례를 발견 할 수 있습니다. 그리고 세 공간에서 당신은 어느 지점에서 멈추는 지 알게 될 것입니다. 어떤 도움

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 

감사합니다,

+0

정확히 당신이하려고하는 것 : 예를 들어

row, col = np.nonzero(hits) idx = row < col # get rid of the diagonal and the upper triangular part row = row[idx] col = col[idx] 

을 같이 당신은 당신의 안타를 얻을 수 있습니다 이루다? 이 카운터들은 모두 매우 혼란 스럽습니다. 랜덤 워크 중 언제 다른 위치와 비슷한 위치인지 알기 위해 노력하고있는 것 같습니다. – Jaime

+0

예. 그리고 내가 사용하기로되어있는 방법은 다음과 같습니다 : – user2193007

+0

본문에서 편집을 참조하십시오. – user2193007

답변

2

당신은 그 자체에 대한 귀하의 위치 벡터의 직접 비교를 수행 할 수 있습니다 이제

deltas = np.abs(position[None, :] - position[:, None]) 

, deltas[i, j] 단계 i의 위치 사이의 거리이며, 단계 j.

hits = deltas <= TOLERANCE 

가까운 위치의 쌍을 얻으려면 다음을 수행 할 수 있습니다 :

>>> position = genPositions(NUM_STEPS, MAX_STEP_SIZE) 
>>> row, col = np.nonzero(np.abs(position[None, :] - 
...        position[:, None]) < TOLERANCE) 
>>> idx = row < col 
>>> row= row[idx] 
>>> col = col[idx] 
>>> row 
array([ 35, 40, 112, 162, 165, 166, 180, 182, 200, 233, 234, 252, 253, 
     320, 323, 325, 354, 355, 385, 432, 443, 451], dtype=int64) 
>>> col 
array([ 64, 78, 115, 240, 392, 246, 334, 430, 463, 366, 413, 401, 315, 
     380, 365, 348, 438, 435, 401, 483, 473, 492], dtype=int64) 

>>> for j in xrange(len(row)) : 
...  print '{0}, {1} --> {2}, {3}'.format(row[j], col[j], position[row[j]], 
...           position[col[j]]) 
... 
35, 64 --> 2.56179226445, 2.56275159205 
40, 78 --> 2.97310455111, 2.97247314695 
112, 115 --> 3.40413767436, 3.40420856824 
... 
432, 483 --> 10.2560778101, 10.2556475598 
443, 473 --> 10.7463713139, 10.7460626764 
451, 492 --> 12.3804383241, 12.3805940238 
+0

히트 수를 정량화하려고 할 때 500 번만 걸 으면 500 회 이상의 값을 반환합니다. np.sum (조회수)을 시도하고 np.count_nonzero (조회수) – user2193007

+0

@ user2193007'hits'은 대각선에서 501'True's를 가지며 두 번 조회 할 때마다 두 번 ('i, j)' '(j, i)'로 표시됩니다. 합계에서 501을 뺀 다음 2로 나누어 실제 히트 수를 얻습니다. – Jaime

+0

감사합니다. 귀찮게해서 미안하지만 만약 당신이 또한 저에게 깜짝 놀랄만 한 배열의 조각에 대해 조금 가르쳐 줄 수있는 리소스에 대한 링크를 줄 수 있다면! – user2193007