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的二维数组记录。
NumPy提供where(condition[, x, y])函数实现数组元素的条件赋值,参数condition是条件表达式,如果condition结果为True,则返回x,否则返回y。x、y可以是数组,也可以是标量。
这里where()函数判断rndwlk数组每个元素值和0的关系,如果大于0,则该元素值赋为1,否则赋为-1。
2.计算每步游走后的位置
rndwlk记录了物体每步沿着x轴、y轴运动的方向,计算第i步所处的位置只需分别累计从第1步到第i步沿x轴、y轴移动单位总和即可。ndarray的聚集函数cumsum()就可以实现此功能。
cumsum()函数按行进行累加,即每行第i列的值为原数组0~i列值的和,数组变量position保存了每步结束后物体在二维平面上的位置。
3.计算每步游走后到原点的距离
利用算术运算符和通用函数,可以算出物体在每步结束后到原点的距离。计算得到的浮点数小数位数太长,可以使用np.set_printoptions()函数设置显示的小数位数。
对数组dists统计物体距离原点的最大值、最小值和平均值。
统计物体游走过程中离原点大于平均距离的次数。
dists>dists.mean()生成一个一维的布尔类型数组,大于平均值的位置为True,否则为False。当sum()函数求和时,True的值视为1,False为0,True的个数也就是超出平均距离的次数。
4.绘图展示游走轨迹
将position中的位置数据标识在二维坐标系上,即可展示随机游走的轨迹,如图2-2所示。绘制图形函数的使用方法见第4章。
图2-2 二维平面上一次随机漫步的轨迹图
思考与练习
1.将随机游走的步数增加到100步,计算物体最终到原点的距离。
2.重复多次随机游走过程,物体到原点距离的变化趋势是什么。