【问题标题】:Python generate range array with random step sizePython生成具有随机步长的范围数组
【发布时间】:2018-11-14 02:28:20
【问题描述】:

目标:使用随机数初始化具有预定义大小的数组。 我已经尝试过这种方式并且可以正常工作:

xa = np.empty(100)
xa[0] = random.random()
for i in range(1,100):
    xa[i] = xa[i-1] + random.random()

我的问题:有没有更好的方法呢?也许没有 for 循环?

【问题讨论】:

  • 我觉得不错。
  • 当您创建 np.empty(100) 时,它已经是随机的了...?我不确定我是否遵循您的问题。您是否只是希望每个后续元素都大于前一个元素?
  • cumsum 在随机的步骤数组上?
  • 它是一个包含 100 个随机数的数组吗?还是有什么具体条件?
  • 详细说明@hpaulj 评论:xa = np.cumsum(np.random.rand(100))

标签: python numpy random range


【解决方案1】:

鉴于您使用的是 numpy,您问题中的代码相当于:

import numpy as np
np.random.seed(42)

xa = np.cumsum(np.random.random(100))
print(xa[:5])

输出

[0.37454012 1.32525443 2.05724837 2.65590685 2.81192549]

但是,如果您想要返回一个范围的东西(例如来自 range 函数的那个​​),但是通过随机步骤,您可以执行以下操作:

xa = np.cumsum(np.random.randint(100, size=(100,)))
print(xa[:5])

输出

[ 62 157 208 303 306]

请注意,在这两种情况下,仅打印前 5 个数字。同样在这两种情况下,步骤都是积极的。

进一步

  1. 有关cumsumrandintrandom 的文档。

【讨论】:

    【解决方案2】:

    你也可以使用itertools.accumulate函数:

    from itertools import accumulate
    import numpy as np
    import random
    
    xa = np.empty(100)
    xa[0] = random.random()
    
    xa = list(accumulate(xa, lambda x, y: x + random.random()))
    

    我不太确定这是否是您所需要的,但它使用 prev + random.random() 计算每个元素,就像您在问题中所写的那样。

    【讨论】:

    • 很好的答案。效果很好。谢谢。
    【解决方案3】:

    简单的单行

    import random 
    xa = random.sample(range(1, 101), 100)
    

    【讨论】:

    • 这是一个很好的答案。不要忘记将结果分配给xa ;)
    • 我相信 random.random() 返回一个介于 0 和 1 之间的浮点数。所以这不会返回与 OP 相同的值。
    • 这是我得到的输出 [86, 15, 91, 75, 65, 46, 81, 45, 94, 3, 61, 28, 96, 29, 5, 100, 62, 89, 20, 92, 32, 76, 55, 87, 84, 27, 6, 11, 80, 95, 90, 67, 9, 41, 59, 48, 54, 42, 79, 52, 24, 93, 1, 19, 18, 13, 50, 71, 49, 97, 12, 78, 25, 66, 47, 38, 40, 33, 68, 26, 53, 8, 16, 43, 21, 70, 72, 56, 7, 63, 37, 58, 51, 34, 14, 69, 64, 83, 73, 4, 85, 2, 77, 31, 30, 82, 35, 44, 98, 17, 99, 74, 88、36、10、60、22、23、39、57]
    • OP的输出不返回整数
    【解决方案4】:

    你可以比你的代码更好地使用它

    import random
    xa = [None] * 100
    xa[0] = random.random()
    for i in xrange(1, 100):
            xa[i] = xa[i-1] + random.random()
    

    【讨论】:

      【解决方案5】:

      使用列表理解:

      import random
      n = 100   # your array size
      xa = [random.random() for _ in range(n)]
      

      如前所述,np.empty(100) 已经为您提供了一个完全随机大小的数组。 np.empty() 有什么问题?

      【讨论】:

      • 感谢您的回答,但不是我想要的。这只是返回一个随机数列表,而不是我所追求的随机数的累积总和。还值得一提的是 np.empty(100) 实际上并不是随机的,而是垃圾(无论分配给数组的内存地址中的信息是什么),我认为这是不同的。
      猜你喜欢
      • 2018-10-20
      • 2019-08-06
      • 2013-12-14
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多