Numpy гистограмма очень медленная на небольшом наборе данных - PullRequest
2 голосов
/ 12 марта 2020

У меня проблемы с использованием гистограммы Numpy для определенного набора данных.

Проблема в том, что я получаю очень медленный ответ (несколько минут), а также очень большое использование памяти. Поведение памяти, которое я заметил, - это пик 12 ГБ, который затем уменьшается до ~ 750 МБ, а затем возвращается к большим ГБ. Это, кажется, повторяется бесконечно. Даже если я позволю этому пройти. Это занимает несколько минут, и в конце я получаю ошибку памяти.

Все это происходит, когда передается (очень) небольшой набор данных, такой как приведенный ниже (26 элементов):

array(['2.400000024000011e-05', '2.4000000240000108e-05',
       '2.400000024000011e-05', '2.400000024000012e-05',
       '2.4000000240000105e-05', '2.4000000240000105e-05',
       '2.400000024000009e-05', '2.400000024000012e-05',
       '2.400000024000012e-05', '2.400002024000031e-05',
       '2.4000000240000145e-05', '2.400000024000012e-05',
       '2.400000024000012e-05', '2.4000000240000064e-05',
       '2.400000024000012e-05', '2.400000024000012e-05',
       '2.400000024000012e-05', '2.400000024000012e-05',
       '2.400000024000012e-05', '2.400000024000012e-05',
       '2.400000024000001e-05', '2.400000024000012e-05',
       '2.4000020240000364e-05', '2.400000024000012e-05',
       '2.400000024000012e-05', '2.400000024000012e-05'], dtype='float64')

Я предполагаю, что часть замедления может быть связана с достижением предела физической памяти, а затем ограничена временем подкачки.

Гистограмма рассчитывается следующим образом:

histY, histX = np.histogram(vals, bins='auto')

Где '' 'vals' '' - пример значений в массиве Numpy, предоставленном выше

* Обратите внимание на небольшой минимум-максимум в приведенном выше случае 2.0000000353764813e-11

Мои быстрые догадки; функция гистограммы застряла, выполняя некоторую итеративную оптимизацию, чтобы найти наилучшие размеры бинов в сравнении с количеством бинов для этого набора данных, и у нее возникают проблемы с небольшим минимальным запасом.

Ошибка, которую я получаю, когда она наконец заканчивается:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".....\lib\site-packages\numpy\lib\histograms.py", line 737, in histogram
    n = np.zeros(n_equal_bins, ntype)
MemoryError

Может кто-нибудь объяснить, что на самом деле здесь происходит и что можно сделать, чтобы обойти проблему?

...