文章目录
- 题目描述
- 代码实现
- 关于本题涉及到的几个函数
- 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.
说人话就是:返回沿轴的最大值的索引。
用例子看可能更便于理解: