Numpy实现酒鬼漫步问题【以及randint()、where()、cumsum()、argmax()的用法详解】


题目描述

从前有一个酒鬼,喝醉了行走在一条直线上,每走一步方向是不确定的(向前或者向后),当他走了2000步后,试求终点距离原点的距离。


代码实现

# 酒鬼走了2000步,终点和原点的距离
step = 2000
draw = np.random.randint(0, 2, size=step)  # 随机生成2000步
direction_step = np.where(draw > 0, 1, -1)  # 向前走一步记作1,向后走一步记作-1
distance = direction_step.cumsum()  # 使用cumsum()函数计算步数的累计和,也就是距原点的距离
result = distance[step - 1]  # 用result保存终点距离原点的结果
if result > 0:
    print("最终较之原点向前走了:", result, "步")
else:
    print("最终较之原点向后走了:", abs(result), "步")

关于本题涉及到的几个函数

randint()

格式:randint(low, high=None, size=None, dtype=None)

作用:从指定的dtype以“离散均匀”分布的方式在“前闭后开”的区间[ low,high )中返回随机整数。如果 high为None(默认值),则结果来自[0,low)。

例子:

在这里插入图片描述


where()

格式:where(condition, x=None, y=None)

也可写成:where(condition, [x, y])

作用:Return elements chosen from x or y depending on condition.

简单来讲,condition作为判断条件,为True则产生x,否则产生y

例子
在这里插入图片描述


cumsum()

cumsum是数组统计运算中的方法,作用为:计算所有元素的累计和

格式:cumsum(self, axis=None, dtype=None, out=None)

作用:Return the cumulative sum of the elements along the given axis.

人话就是:根据所给轴——axis的值,进行累计和计算

结合例子来看:

在这里插入图片描述
在这里插入图片描述
根据上图我们可以知道,axis=None时,将数组平铺展开,当成一维数组,然后从第二个元素开始,执行a[i]=a[i]+a[i-1]+…+a[0](i>=1)的操作,axis=0时,沿着行的方向垂直向下竖着加axis=1时,沿着列的方向水平延申横着加

在cumsum的各个参数中,axis决定了累加的方式,而dtype决定了结果的数据类型,而out则是放置结果的备用输出数组,它的形状和缓冲区长度必须与预期的输出相同,如有必要,将强制转换类型,当out=None时,结果放置在当前数组中,覆盖之前数组中的值

PS:关于axis的详细解析,请移步搞清axis的含义,这一篇就够了!


题目拓展

题目描述

在上一题的基础上,我们要计算这个过程中,酒鬼距原点最远的距离是多少?

代码实现

没什么难点,主要就是要记得兼顾向前走和向后走两种情况,避免忽略边缘值
distancemax = distance.max()  # 向前走最远的距离
distancemin = distance.min()  # 向后走最远的距离
if abs(distancemin) < distancemax:  
# 由于向后走的距离是负数,所以要取其绝对值与向前走的距离相比较
    print("整个过程中距离原点最远的距离是向前走了:", distancemax, "步")
else:
    print("整个过程中距离原点最远的距离是向后走了:", abs(distancemin), "步")

题目拓展

题目描述

基于原始题目,尝试计算当第一次距原点的距离大于等于20米时,他总共走了多少步,设每步步长1.5米

代码实现

仍然是需要注意向后走、向前走两种情况
steps = 20 / 1.5  # 将距离20米转换为步数,存储到steps中
walk = (np.abs(distance) >= steps).argmax()
# (np.abs(distance) >= steps)返回的是一个布尔数组
# 故需要用argmax从满足条件的布尔数组中返回最大值的索引
print("当酒鬼走了", walk, "步时,此时距离原点的长度是大于或者等于20米的")

argmax()

格式:argmax(a, axis=None, out=None)

作用:Returns the indices of the maximum values along an axis.

说人话就是:返回沿轴的最大值的索引。

例子看可能更便于理解:
在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·Jormungand

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值