Гистограмма Numpy больших массивов

У меня есть набор csv наборов данных, приблизительно 10 ГБ в размере каждый. Я хотел бы генерировать гистограммы из их столбцов. Но это походит на единственный способ сделать, что это в numpy должно сначала загрузить весь столбец в массив numpy и затем звонить numpy.histogram на том массиве. Это использует ненужный объем памяти.

numpy поддерживает binning онлайн? Я надеюсь на что-то, что выполняет итерации по моему csv линию за линией и значениям мусорных ведер, поскольку он читает их. Этот путь самое большее одна строка находится в памяти в любой момент.

Не было бы твердо прокрутить мое собственное, но задающийся вопросом, изобрел ли кто-то уже это колесо.

15
задан garageàtrois 17 March 2010 в 18:31
поделиться

2 ответа

Как вы сказали, не так уж и сложно сделать свой собственный. Вам нужно будет самостоятельно настроить бины и повторно использовать их по мере итерации файла. Следующее должно быть достойной отправной точкой:

import numpy as np
datamin = -5
datamax = 5
numbins = 20
mybins = np.linspace(datamin, datamax, numbins)
myhist = np.zeros(numbins-1, dtype='int32')
for i in range(100):
    d = np.random.randn(1000,1)
    htemp, jnk = np.histogram(d, mybins)
    myhist += htemp

Я предполагаю, что производительность будет проблемой с такими большими файлами, и накладные расходы на вызов гистограммы для каждой строки могут быть слишком медленными. Предложение @doug'а о генераторе кажется хорошим способом решения этой проблемы.

12
ответ дан 1 December 2019 в 03:04
поделиться

Вот способ прямого бинирования значений:

import numpy as NP

column_of_values = NP.random.randint(10, 99, 10)

# set the bin values:
bins = NP.array([0.0, 20.0, 50.0, 75.0])

binned_values = NP.digitize(column_of_values, bins)

'binned_values' - это индексный массив, содержащий индекс бина, к которому принадлежит каждое значение в column_of_values.

'bincount' даст вам (очевидно) количество бинов:

NP.bincount(binned_values)

Учитывая размер вашего набора данных, использование Numpy's 'loadtxt' для создания генератора может оказаться полезным:

data_array = NP.loadtxt(data_file.txt, delimiter=",")
def fnx() :
  for i in range(0, data_array.shape[1]) :
    yield dx[:,i]
6
ответ дан 1 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: