通过前面对NumPy的学习,相信大家一定对NumPy这个科学计算包有了一定的了解,接下来,本节将通过酒鬼漫步的案例来介绍如何运用NumPy随机数模块与数据处理。
下面先为大家描述一下场景,在一片空旷的平地上(一个二维地面上)有一个酒鬼,他最初停留在原点的位置,这个酒鬼每走一步时,方向是不确定的,在经过时间t之后,我们希望计算出这个酒鬼与原点的距离。
例如,这个酒鬼走了2000步(每步为0.5米),向前走一步记为1,向后走一步记为-1,当计算距原点的距离时,就是将所有的步数进行累计求和。因此,使用random模块来随机生成2000个“掷硬币值”(两个结果任选一个),具体代码如下:
导入numpy包
import numpy as np
steps=2000
draws=np.random.randint(0, 2, size=steps)
# 当元素为1时,direction_steps为1,
# 当元素为0时,direction_steps为-1
direction_steps=np.where(draws>0, 1, -1)
# 使用cumsum()计算步数累计和
distance=direction_steps.cumsum()
有了步数的累计和之后,可以尝试计算酒鬼距离原点最远的距离,即分别调用max()与min()计算向前走与向后走的最大值,具体代码如下。
In [141]: # 使用max()计算向前走的最远距离
distance.max()
Out[141]: 12
In [142]: # 使用min()计算向后走的最远距离
distance.min()
Out[142]: -31
从两次输出的结果中可以看出,这个酒鬼走的最远的距离是朝后方距离原点15.5(31×0.5)米的位置。值得一提的是,由于这里使用的是随机数,所以每次运行的结果是随机的。
当酒鬼距原点的距离大于或等于15米时,如果希望计算他总共走了多少步,则可以使用数学方程“|x×0.5|≥15”完成,其中x表示步数。要想计算一个数的绝对值,则需要调用abs()函数实现,不过该函数返回的是一个布尔数组,即不满足条件的值均为False,满足条件的值均为True。为了从满足条件的结果中返回最大值的索引,则还需要通过调用argmax()方法来实现,具体代码如下。
In [143]: # 15米换算成步数
steps=15/0.5
(np.abs(distance)>=steps).argmax()
Out[143]: 877
从计算结果可以看出,当酒鬼走到877步时,此时距离原点的长度是大于或等于15米的。