NumPy 基本操作(随机漫步)

                                                    随机漫步

 

随机漫步的模拟(https://en.wikipedia.org/wiki/Random_walk)提供了一个使用数组操作的说明性应用。首先,让我们考虑一个简单的随机漫步,从 0 开始,步进为 1 和 -1,且两种步进发生的概率相等。

以下是使用内建 random 模块利用纯 python 实现的一个 1000 步的随机漫步:

    

    

可以观察到 walk 只是对随机步进的累积,并且可以通过一个数组表达式实现。因此,我使用 np.random 模块一次性抽取 1000 次投掷硬币的结果,每次投掷的结果为 1 或 -1,然后计算累积值:

    

    

    

    

由此,我们开始从漫步轨道上提取一些统计数据,比如 最大值、最小值 等:

    

更复杂的统计是第一次穿越时间,即随机漫步的某一步达到了某个特定值。这里假设我们想要知道漫步中是何时连续朝某个方向连续走了 10 步。np.abs(walk) >= 10 给我们一个布尔值数组,用于表明漫步是否连续在同一方向走了 10 步,但是我们想要的是第一次走了 10 步或 -10 步的位置。我们可以使用 argmax 来计算,该函数可以返回布尔值数组中最大值的第一个位置(True 就是最大值):

    

请注意,这里使用 argmax 效率并不高,因为它总是完整地扫描整个数组。在这个特殊的示例中,一旦 True 被发现,我们就知道最大值了。

 

一次性模拟多次随机漫步:

    模拟多次随机漫步,比如说 5000 步。

    如果传入一个 2 个元素的元组,numpy.random 中的函数可以生成一个二维的抽取数组,并且我们可以一次性地跨行算出全部 5000 个随机步的累积和:

        

    现在我们可以计算出这些随机步的最大值和最小值了:

        

    让我们在这些随机步中计算出 30 或 -30 的最小穿越时间。这有点棘手,因为不是所有的 5000 个都达到了 30。我们可以用 any 方法来检查:

        

    我们可以使用布尔值数组来选出绝对步数超过 30 的步所在的行,并使用 argmax 从轴向 1 上获取穿越时间:

        

    利用其他分布而不是等概率的掷硬币实验来随机漫步也是很容易得。只需要使用一个不同的随机数生成函数,比如 normal,再根据特定的均值和标准差即可生成正态分布下的随机步:

        

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值