Как эффективно создать гистограмму с большим количеством бинов и данных - PullRequest
0 голосов
/ 08 февраля 2019

Меня просят посмотреть, как применяется теория центрального предела с равномерно распределенными случайными числами.Для первой части задачи меня попросили создать 1 000 000 ячеек с одним номером в каждом ящике, а затем 2, 3 и 10 чисел в каждом ящике.

Я использовал пакет NumPy для создания гистограмм, но попытка создать 1 000 000 лотков с одним номером в каждом блоке занимает безбожное количество времени.Мне удалось создать гистограмму из 1000 и 10000 бинов и случайных чисел, хотя я думаю, что numpy.hist просто не эффективный метод для обработки большого количества бинов.

Существуют ли другие методы для создания гистограммс большими объемами данных и ячейками?

РЕДАКТИРОВАТЬ: случайное число находится в интервале [0,1].

1 Ответ

0 голосов
/ 08 февраля 2019

Вы оставили детали из своего вопроса, которые могут иметь решающее значение.

Какой у вас размер ячейки (то есть у вас есть ячейки 1М между [0,1], между [0,20] или между [0,1M]) ..?Каковы ваши требования к производительности и что является «медленным» для ваших целей?Достигаете ли вы ограничений памяти, ограничений использования процессора или чего-то еще?

Одно из тривиальных решений - использовать random.random() для генерации случайного числа между [0,1], а затем использовать умножение / сложение для выборки вкакой бы интервал вам не понадобился.

В следующем примере кода бины размером 1 М, каждый размером 1, с каждым бином, содержащим 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

Это соответствует вашим потребностям и требованиям?

...