Храните только данные «столбца» в h5py без загрузки всего файла данных

У меня есть относительно большой набор данных (около 8 ГБ), и я прочитал его в блокноте jupyter, используя h5py.

Форма набора данных выглядит примерно так (50000000, 384). В моем идеальном наборе данных это было бы транспонировано, чтобы я мог просматривать каждый «столбец» в наборе данных. Единственный способ, которым я смог добиться получения каждого «столбца», - это либо индексация для каждого столбца (что очень медленно и интенсивно для ЦП, потому что оно идет по строкам в 50000000 строк), либо преобразовать данные h5 в np.array и транспонировать это, что также очень медленно и неэффективно.

Например, у меня есть файл h5:

chunk_file = h5py.File(chunk_fil_1, "r")

chunk_file["ex_dat"]

выход:

HDF5 dataset "ex_dat": shape (50000000, 384)

Если я сделаю это:

len(chunk_file["ex_dat"][0])

выход:

384

Здесь я хотел бы, чтобы мой вывод был всеми 50000000 появлений столбца «0».

Есть ли эффективный способ индексировать файл h5 для столбцов, таких как данные, без чтения каждой строки? Или другие альтернативы для чтения этого большого набора данных? Моя конечная цель - сохранить отдельные «столбцы» в кадре данных pandas.


person Pierpressure    schedule 21.09.2017    source источник
comment
Что делает arr = chunk_file["ex_dat"][:,0]? Я ожидаю, что он читает столбец 0. Это будет медленнее, чем чтение chunk_file["ex_dat"][0,:], но все же должно быть разумным.   -  person hpaulj    schedule 22.09.2017
comment
Вы хотите Dataframe с 384 столбцами и 50... строками? Вы только что прочитали все это.   -  person hpaulj    schedule 22.09.2017
comment
stackoverflow.com/questions/ 50418649/   -  person Nasty    schedule 16.01.2019


Ответы (1)


Итак, chunk_file['ex_dat'] — это массив numpy формы (50000000, 384). Индексирование этого с помощью целого числа автоматически захватывает строку, что является ожидаемым поведением. Чтобы получить столбец вместо строки в массиве numpy, просто проиндексируйте его, как

chunk_file['ex_dat'][:,0]

где : — «все строки», а 0 — первый столбец. Это то же самое, что переставить матрицу (array.T с numpy) и затем взять первую строку

chunk_file['ex_dat'].T[0]

person pretzlstyle    schedule 21.09.2017
comment
Правильно, это также занимает кучу моего процессора - предположительно, потому что он все еще читает каждую строку, тогда как все, что мне нужно, это информация о столбце. Если я не интерпретирую это неправильно, и на самом деле поиск 0-го индекса в каждой строке требует больших вычислительных ресурсов? - person Pierpressure; 22.09.2017
comment
@Pierpressure, данные расположены в файле в порядке C, строка за строкой. Так что да, загрузка [:,0] означает, что при каждом чтении будет пропущено 384 элемента вперед. Но это невозможно, учитывая, как хранятся данные. Если, как следует из названия, данных chunked, то вы можете прочитать подмножества строк для экономии памяти. Проверьте документы h5py. - person hpaulj; 22.09.2017