Чтение огромных данных и постоянное обновление гистограммы - PullRequest
0 голосов
/ 01 мая 2020

У меня огромное количество данных, хранящихся в файлах h5. Каждый файл имеет ~ 1200 подпапок, в которых есть таблицы с ~ 65 тыс. Столбцов. Мне нужно поместить данные в гистограмму, и я не знаю диапазон данных. Есть ли способ читать и заполнять гистограммы одновременно?

Я пытался добавить данные в массив, но, как вы можете видеть, массив имеет ~ 780M элементов для 10 файлов:

import h5py
import numpy as np
import matplotlib.pyplot as plt

        aiArr = []

        ### FILES                                                                                               
        for ff in range(0,10):
            f= h5py.File('/data/file'+str(ff)+'.h5','r')
            ### KEYS
            for i,key in enumerate(f.keys()):
                if ff==0 and i==0:
                   aiArr = np.array(f[key]['AI'][()])[0]
                else:
                   aiArr = np.append( aiArr , np.array(f[key]['AI'][()])[0] ,axis=0 )

         plt.hist(aiArr,bins='auto')                                          
         plt.savefig('hist_0.png')

В качестве альтернативы я сделал временные гистограммы после key l oop, а затем суммировал их как hist_of_file += np.histogram(temp_hist,bins=bin_edges), но он жалуется, что ValueError: operands could not be broadcast together with shapes (1235,) (1234,) и мне пришлось определить bin_edges после первого ввода данных. Это не идеально, так как остальные данные могут его переполнить, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 03 мая 2020

Вы можете сделать это эффективным способом памяти, но это потребует двух проходов. Во-первых, вы должны просмотреть ваши данные и найти минимальные и максимальные значения. Затем выберите количество бинов для своей гистограммы и рассчитайте диапазоны значений для каждого бина.

Например, если ваши данные имеют диапазон (0,100) и вы хотите гистограмму из 10 бинов, диапазоны будут [[0.0 , 10.0], [10.0,20.0], ... [90.0,100.0]]

Затем вы должны создать целочисленный массив с длиной, равной числу бинов (это будет ваша гистограмма) и инициализировать его с нулями.

Затем выполните второй l oop, для каждого элемента ваших данных определите, какой ячейке он соответствует, и увеличьте счетчик для этой ячейки. В конце массив гистограммы будет содержать данные, которые вам необходимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...