【问题标题】:NumPy change elements of an array with a given probabilityNumPy 以给定的概率更改数组的元素
【发布时间】:2012-07-20 04:16:21
【问题描述】:

我有一个随机数数组。我只想根据 0.07 的概率更改一些元素。目前我正在使用 for 循环来迭代每个元素。有更好的方法吗?

【问题讨论】:

    标签: arrays random numpy


    【解决方案1】:

    如果有问题的数组被称为a,您可以选择其值的平均比例为0.07

    a[numpy.random.rand(*a.shape) < 0.07]
    

    我不知道如何您想更改这些值。要将它们乘以 2,只需这样做

    a[numpy.random.rand(*a.shape) < 0.07] *= 2.0
    

    【讨论】:

    • 太棒了!谢谢。我只是想将它们更改为其他随机值。这比我的 for 循环好多了。
    • 请注意,以 p 的概率(独立地)改变元素和改变“其值的比例 p”是有区别的。我认为显示的代码是前者。
    • @tc 如何完成后者?
    • @wot: 使用random.sample(xrange(len(a)),int(len(a)*0.07)) 作为索引,或者模舍入。
    • @tc:您提出了一个很好的观点,但是您提供的解决方案将扼杀该答案中的方法对 OP 原始循环的所有性能改进。
    【解决方案2】:

    斯文的回答很优雅。但是,使用

    选择要更改的元素要快得多
    n = numpy.random.binomial(len(a), 0.07)
    a[numpy.random.randint(0, len(a), size=n)] *= 2.0
    

    第一个表达式确定要采样的元素数量(n 是介于 0 和 len(a) 之间的整数,但平均为 0.07),第二个表达式准确生成要检索的索引数。 (但请注意,您可能会多次获得相同的索引。)

    的区别
    a[numpy.random.rand(len(a)) < p]
    

    随着 p 接近 1 变小,但对于较小的 p,它可能是 10 或更多的因数。

    【讨论】:

      猜你喜欢
      • 2021-10-22
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2016-01-06
      相关资源
      最近更新 更多