2016-02-03 5 views
2

У меня есть файл HDF5 с 20 наборами данных, каждый из которых содержит 200 строк сложного dtype ('<r4', '<r4', '<i4'), где каждый компонент dtype представляет собой одномерную переменную. Я нахожу, что для открытия каждого файла требуется около 2 секунд и назначить компонент столбца своей переменной, что кажется мне очень медленным. Я использую h5py и NumPy, чтобы открыть и прочитать из файла в Numpy массивы:Что такое быстрый способ в Python читать массивы HDF5 dtype?

import numpy as np 
import h5py 
... 
f = h5py.File("foo.hdf5", "r") 
set1 = f["foo/bar"] 
var1 = np.asarray([row[0] for row in set1]) 
var2 = np.asarray([row[1] for row in set1]) 
var3 = np.asarray([row[2] for row in set1]) 

Есть ли более быстрый способ извлечь переменные из этих наборов данных?

Вот скриншот одного из наборов данных с использованием hdfview: hdfview

+1

Вы пробовали 'var1 = set1 [:, 0]'? Если 'set1' является« набором данных », вы можете индексировать его почти так же (и) в виде массива numpy. http://docs.h5py.org/en/latest/high/dataset.html – hpaulj

+0

Да, и я получаю сообщение об ошибке «TypeError: Argument sequence too long». Кроме того, если я попробую 'set1 = f [" foo/bar "] [...]', за которым следует 'var1 = set1 [:, 0]' I receive "IndexError: слишком много индексов для массива" – DavidH

+0

Что такое 'set1 .shape'? Была ли первая 'set1'' группа', а не 'dataset'? Я не знаю структуру данных в вашем файле. Вы должны сами это изучить. – hpaulj

ответ

2

гораздо более быстрый способ (~ 0,05 секунды) является преобразование набора данных в массив, а затем ссылаться на поля по имени:

import numpy as np 
import h5py 
... 
f = h5py.File("foo.hdf5", "r") 
set1 = np.asarray(f["foo/bar"]) 
var1 = set1["var1"] 
var2 = set1["var2"] 
var3 = set1["var3"]