文章目录

  • 题目描述
  • 代码实现
  • 关于本题涉及到的几个函数
  • 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)。

例子:

python酒鬼漫步中学到什么 酒鬼漫步代码python_python酒鬼漫步中学到什么


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

例子:

python酒鬼漫步中学到什么 酒鬼漫步代码python_python_02


cumsum()

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

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

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

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

结合例子来看:

python酒鬼漫步中学到什么 酒鬼漫步代码python_数组_03


python酒鬼漫步中学到什么 酒鬼漫步代码python_python_04


根据上图我们可以知道,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.

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

用例子看可能更便于理解:

python酒鬼漫步中学到什么 酒鬼漫步代码python_代码实现_05