У меня есть набор csv наборов данных, приблизительно 10 ГБ в размере каждый. Я хотел бы генерировать гистограммы из их столбцов. Но это походит на единственный способ сделать, что это в numpy должно сначала загрузить весь столбец в массив numpy и затем звонить numpy.histogram
на том массиве. Это использует ненужный объем памяти.
numpy поддерживает binning онлайн? Я надеюсь на что-то, что выполняет итерации по моему csv линию за линией и значениям мусорных ведер, поскольку он читает их. Этот путь самое большее одна строка находится в памяти в любой момент.
Не было бы твердо прокрутить мое собственное, но задающийся вопросом, изобрел ли кто-то уже это колесо.
Как вы сказали, не так уж и сложно сделать свой собственный. Вам нужно будет самостоятельно настроить бины и повторно использовать их по мере итерации файла. Следующее должно быть достойной отправной точкой:
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'а о генераторе кажется хорошим способом решения этой проблемы.
Вот способ прямого бинирования значений:
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]