Что такое быстрый способ вывода набора данных h5py в текст? - PullRequest
4 голосов
/ 11 июня 2010

Я использую пакет python h5py для чтения файлов в формате HDF5. (например, somefile.h5) Я хотел бы записать содержимое набора данных в текстовый файл.

Например, я хотел бы создать текстовый файл со следующим содержимым: 1,20,31,75,142,324,78,12,3,90,8,21,1

Я могу получить доступ к набору данных в python, используя этот код:

import h5py
f     = h5py.File('/Users/Me/Desktop/thefile.h5', 'r')
group = f['/level1/level2/level3']
dset  = group['dsetname']

Мой наивный подход слишком медленный, потому что в моем наборе данных более 20000 записей:

# write all values to file        
for index in range(len(dset)):
        # do not add comma after last value
        if index == len(dset)-1: txtfile.write(repr(dset[index]))
        else:                    txtfile.write(repr(dset[index])+',')
txtfile.close()
    return None

Есть ли более быстрый способ записать это в файл? Возможно, я мог бы преобразовать набор данных в массив NumPy или даже список Python, а затем использовать какой-нибудь инструмент для записи файлов?

(я мог бы поэкспериментировать с объединением значений в большую строку перед записью в файл, но я надеюсь, что есть что-то более элегантное)

Ответы [ 4 ]

5 голосов
/ 11 июня 2010

Создание большой строки обладает огромным преимуществом, так как избавляет от необходимости использовать тупой «переключатель в последний раз» благодаря превосходному методу join: заменить весь цикл

txtfile.write(','.join(repr(item) for item in dset))

Я не уверен, насколько элегантнее вы требуете, чтобы ваш код был ...; -)

3 голосов
/ 14 февраля 2012

Ваше первоначальное подозрение было верным, сначала преобразуйте его в массив Numpy, а затем сбросьте этот массив в ASCII.

my_data = my_h5_group['dsetname'].value # is now a Numpy array
my_data.tofile("my_data.txt")

Это будет значительно быстрее, чем перебор самого объекта группы.

2 голосов
/ 16 июня 2011

возможно использовать h5dump для файла HDF5?

Я использую (bash)

(h5dump -y -o /dev/stderr -d $dataset $infile >$errorout) 2>&1 | sed -e 's/, /\n/g' -e 's/,$//' | sed 's/ //g' > $outfile 2> $errorout
1 голос
/ 24 июля 2018

О, я делаю то же самое и нахожу путь. Если вы хотите получить доступ, например, вот так

print( hdf5['a'][i][j][k] )

Это очень, очень, очень медленно. Вот так.

arr=hdf5[:] # at the out of loop
print( arr[i][j][k] ) # in the loop

Только это небольшое изменение приведет к успеху.

...