【问题标题】:How to efficiently produce a histogram with a large number of bins and data如何有效地生成包含大量 bin 和数据的直方图
【发布时间】:2019-02-08 18:08:37
【问题描述】:

我被要求研究中心极限理论如何应用于均匀分布的随机数。对于问题的第一部分,我被要求创建 1,000,000 个垃圾箱,每个垃圾箱中有一个数字,然后每个垃圾箱中有 2、3 和 10 个数字。

我使用 NumPy 包创建直方图,但尝试创建 1,000,000 个 bin,每个 bin 中有一个数字会花费大量时间。我能够创建一个包含 1,000 和 10,000 个 bin 和随机数的直方图,所以我认为 numpy.hist 并不是处理大量 bin 的有效方法。

还有其他方法可以创建包含大量数据和 bin 的直方图吗?

编辑:随机数在区间 [0,1] 内。

【问题讨论】:

    标签: python jupyter-notebook histogram


    【解决方案1】:

    您在问题中遗漏了可能至关重要的细节。

    您的 bin 大小是多少(即,您在 [0,1]、[0,20] 或 [0,1M] 之间有 1M 个 bin)..?您的性能要求是什么?什么是“慢”?您是否达到了内存限制、CPU 使用限制或其他限制?

    一个简单的解决方案是使用random.random() 生成一个介于 [0,1] 之间的随机数,然后使用乘法/加法来在您需要的任何间隔内进行采样。

    以下代码对 1M 个 bin 进行采样,每个 bin 大小为 1,每个 bin 包含 2 个数字。

    import random
    
    hist_data = []
    in_each_bin = 2
    
    for i in range(1000000):
            for j in range(in_each_bin):
                    hist_data.append(i+random.random())
    
    print(len(hist_data))
    print(hist_data[0:20])
    

    它在我的中型机器上运行不到 3 秒。

    $ time python3 pytest.py
    2000000
    [0.9271533001749838, 0.6759096885597532, 1.0950935186564377, 1.4195955772696995, 2.620307487968376, 2.535700184898931, 3.606823695579621, 3.5471311130365346, 4.01255833303964, 4.013715023517034, 5.42988725471679, 5.257435390135351, 6.681956593279519, 6.686189487682324, 7.916591795688389, 7.598478524938438, 8.309152266029844, 8.997231092516385, 9.801082205541228, 9.198095437802664]
    
    real    0m3.418s
    user    0m2.547s
    sys     0m0.500s
    

    这符合您的需要和要求吗?

    【讨论】:

    • 我在原始问题中添加了一个编辑,我在区间 [0,1] 中。我的机器是 2014 年中期的 MacBook Pro,具有 16 GB 的 RAM,所以我认为我的机器不会受到限制。我尝试了您建议的代码,并且运行速度很快(
    • 我的想法是在[0,1]之间创建数字,然后添加连续的整数,这样你就得到了[0,1]之间的随机数,然后是[1,2],然后是[2, 3]、[3,4] 等(bin 大小为 1)。您可以使用0.001*(i + random.random()) 配置您的 bin 大小并获取 [0, 0.001]、[0.001, 0.002] 等之间的随机数,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多