![数据科学技术与应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/571/31486571/b_31486571.jpg)
2.3 案例:随机游走轨迹模拟
随机游走(Random Walk)又称随机游动或随机漫步,与很多自然、社会现象相关。在自然科学研究中,随机游走是扩散过程的基础,广泛地用于对物理和化学粒子扩散现象的模拟。在实际生活中,人们用随机游走描述花粉的布朗运动、证券的涨跌等。
对随机游走过程的理论研究和计算机模拟已成功地应用于数学、物理、化学和经济等学科,在互联网信息检索、图像分割等领域的应用也取得了很好的效果。本节将NumPy的随机数生成函数与ndarray结合,模拟物体在二维平面上随机游走的过程。
假设物体初始位置处在二维坐标系的(0,0)位置,每步随机地沿着x轴方左移或右移一个单位,同时沿着y轴方左移或右移一个单位,左移或右移的概率是相等的。
1.模拟每步游走方向
为了模拟物体在x轴和y轴上每步的随机运动,首先创建一个2×n的二维数组,行序0表示x轴上的运动,行序1表示y轴上的运动,n为移动总步数。数组元素取值为-1或1,1表示向正向移动一个单位,-1表示负向移动一个单位。
在x轴、y轴不同方向上的移动概率相同,可以使用randint()函数在两个整数之间生成2n个随机数。由于randint()函数只能在连续整数范围内生成随机数,因此先生成由0和1组成的随机数组,然后再将所有的0替换为-1。
假设某次随机游走了10步,用randint()函数随机生成每步走的方向,结果可以使用一个2×10的二维数组记录。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_36_1.jpg?sign=1739364500-RNPhiOtQH02B3RrRC6dQcmdhGH3oit2w-0-e8b3f6280bacd7095292c403d67e6943)
NumPy提供where(condition[, x, y])函数实现数组元素的条件赋值,参数condition是条件表达式,如果condition结果为True,则返回x,否则返回y。x、y可以是数组,也可以是标量。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_36_2.jpg?sign=1739364500-WXPYO3LDcJIAQZtQNmehCJqL8MNpl9xv-0-7224ba2604c0fd413e09ab9bb5651d22)
这里where()函数判断rndwlk数组每个元素值和0的关系,如果大于0,则该元素值赋为1,否则赋为-1。
2.计算每步游走后的位置
rndwlk记录了物体每步沿着x轴、y轴运动的方向,计算第i步所处的位置只需分别累计从第1步到第i步沿x轴、y轴移动单位总和即可。ndarray的聚集函数cumsum()就可以实现此功能。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_36_3.jpg?sign=1739364500-QbiPBsRr6ClcTQpVNr0FLqIk4sTzQYDh-0-df14df25f6c2f4a31b24222f5ee11e51)
cumsum()函数按行进行累加,即每行第i列的值为原数组0~i列值的和,数组变量position保存了每步结束后物体在二维平面上的位置。
3.计算每步游走后到原点的距离
利用算术运算符和通用函数,可以算出物体在每步结束后到原点的距离。计算得到的浮点数小数位数太长,可以使用np.set_printoptions()函数设置显示的小数位数。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_36_4.jpg?sign=1739364500-MqW0MSUpIVI3mOir3JKaZgCd5OlVLdhQ-0-8fc13b1b16841b776094d04ef9e5e5b2)
对数组dists统计物体距离原点的最大值、最小值和平均值。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_37_1.jpg?sign=1739364500-CF2NPsW7CszeqryOEl49OwCrczTSE3YO-0-fa72830c9b821bc2daf182d8a4645a0d)
统计物体游走过程中离原点大于平均距离的次数。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_37_2.jpg?sign=1739364500-G4EUXfBqQiH6dhfNs1jE0pODe8ft7mm4-0-0304800c22125a878d8c6dce8cab2dcc)
dists>dists.mean()生成一个一维的布尔类型数组,大于平均值的位置为True,否则为False。当sum()函数求和时,True的值视为1,False为0,True的个数也就是超出平均距离的次数。
4.绘图展示游走轨迹
将position中的位置数据标识在二维坐标系上,即可展示随机游走的轨迹,如图2-2所示。绘制图形函数的使用方法见第4章。
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_37_4.jpg?sign=1739364500-DdfZVDqG6Gcl1Pt1YnH8Nm09FzVQWZbZ-0-ef7b4d17fdd99a39a76708dd05f8b260)
图2-2 二维平面上一次随机漫步的轨迹图
![](https://epubservercos.yuewen.com/4FDE69/17042065704478806/epubprivate/OEBPS/Images/34665_37_3.jpg?sign=1739364500-SwbFHDBSC90pz2exda5AymazmvWnqmqe-0-e83a8b6ba07705267d0d84d363587390)
思考与练习
1.将随机游走的步数增加到100步,计算物体最终到原点的距离。
2.重复多次随机游走过程,物体到原点距离的变化趋势是什么。