Numpy数组将两个数组按元素进行比较,以增加标记的偏移量

Numpy数组将两个数组按元素进行比较,以增加标记的偏移量,numpy,random-walk,Numpy,Random Walk,这是仅使用numpy数组的随机游走问题的一个版本。为了找出在500步以上重新访问位置的时间,我们必须将已排序的位置数组与其偏移量进行比较,记录接近0的时间,然后增加偏移量 这是我到目前为止的代码,问题是在“while”循环中,我试图存储位置作为“zeroArray”中的元素重新访问的最终次数 当我运行它时,我得到一个索引错误,没有记录任何结果,并且一个计数器迭代了很多次,即使循环停止的布尔表达式已经更改 编辑:如何使用numpy数组查找重复位置:1)按递增顺序对最终位置数组排序。 2) 只要找到

这是仅使用numpy数组的随机游走问题的一个版本。为了找出在500步以上重新访问位置的时间,我们必须将已排序的位置数组与其偏移量进行比较,记录接近0的时间,然后增加偏移量

这是我到目前为止的代码,问题是在“while”循环中,我试图存储位置作为“zeroArray”中的元素重新访问的最终次数

当我运行它时,我得到一个索引错误,没有记录任何结果,并且一个计数器迭代了很多次,即使循环停止的布尔表达式已经更改

编辑:如何使用numpy数组查找重复位置:1)按递增顺序对最终位置数组排序。 2) 只要找到偏移量在0.001m范围内的位置,就可以比较偏移量增加的切片 也就是说,将位置与相邻位置(偏移量1)进行比较。你可能会发现18个案例,其中邻居计算,在两个空间中,你可能只会发现2个案例。在三个空格处,你会找到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
将numpy导入为np
随机输入
最大步长=0.90#单个步长的最大步长[m]
NUM_STEPS=500#随机行走的步数[]
NUM_WALKS=10#一次跑步中的随机行走次数[]
公差=0.001#被认为相同的点间距[m]
步骤_至_记录_1=100#记录和分析的第一步[]
步骤_至_记录_2=500#第二步记录和分析【】
随机种子(12345)
#距离
def距离(位置A、位置B):
“”“两个位置之间的距离”“”
返回np.abs(posA-posB)
#初始位置
def initialPosition():
“”“随机行走开始时助行器的初始位置”“”
返回0.0
def GEN位置(nSteps、maxStep):
“”“在-maxStep和-maxStep之间的随机步长后返回新位置。”
maxStep,给定上一个位置“”
genArray1=(maxStep-(-maxStep))*(np.random.random(nSteps+1))+(-maxStep)
genArray1[0]=初始位置()
返回np.cumsum(genArray1)
一步=np.0(NUM_步)
fiveStep=np.0(行走次数)
zeroStep=np.Zero(NUM_步行)
walkArray=np.0(NUM_WALKS)
计数器=1
命中计数器=0
零计数器=0
keepchecking=bool(1)
对于范围内的ii(行走次数):
位置=(genPositions(步数,最大步数)
一步[ii]=位置[100]
fiveStep[ii]=位置[-1]
zeroArray=np.排序(位置)
当keepchecking==bool(1)时:
零计数器=0
对于范围内的jj(len(zeroArray)):
命中计数器=0

如果距离(zeroArray[jj+计数器]、zeroArray[jj])您可以将位置向量与自身进行直接比较,如下所示:

deltas = np.abs(position[None, :] - position[:, None])
现在,
delta[i,j]
是步骤
i
和步骤
j
位置之间的距离。您可以通过以下方式获得您的点击率:

hits = deltas <= TOLERANCE
hits=delta>>position=genPositions(步数,最大步数)
>>>行,列=np.nonzero(np.abs)(位置[None,:]-
…位置[:,无]<公差)
>>>idx=行<列
>>>行=行[idx]
>>>col=col[idx]
>>>划船
数组([35,40,112,162,165,166,180,182,200,233,234,252,253,
320323325354355432443451],数据类型=int64)
>>>上校
数组([64,78,115,240,392,246,334,430,463,366,413,401,315,
380、365、348、438、435、401、483、473、492],数据类型=int64)
>>>对于X范围内的j(透镜(行)):
...     打印“{0},{1}-->{2},{3}”,
…位置[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

您到底想实现什么目标?所有这些计数器都非常混乱。你似乎在试图找出,在随机行走过程中,这个位置何时与行走中的另一个位置相似?没错。我应该使用的方法如下:看我在主文本中的编辑当我试图量化点击次数时,它返回的值超过500次,仅500个位置的行走?我尝试了np.sum(hits)和np.count_nonzero(hits)@user2193007
hits
在对角线上有501
True
s,并且每次点击都要计数两次,分别是
(I,j)
(j,I)
。从总数中减去501,再除以2得到实际的点击数。谢谢!!很抱歉打扰您,但如果您还可以提供一个到资源的链接,该链接可以教我一些有关numpy阵列切片的知识,那将是非常棒的@user2193007是一个很好的起点,是关于它的文档的一部分。一般来说,numpy文档是您所需要的全部。
row, col = np.nonzero(hits)
idx = row < col # get rid of the diagonal and the upper triangular part
row = row[idx]
col = col[idx]
>>> 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