Что такое быстрый способ вывода набора данных h5py в текст?

Я использую пакет 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 ответа

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

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

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

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

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

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

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

Я использую (Баш)

(h5dump -y -o /dev/stderr -d $dataset $infile >$errorout) 2>&1 | sed -e 's/, /\n/g' -e 's/,$//' | sed 's/ //g' > $outfile 2> $errorout

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

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

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

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

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

Другие вопросы по тегам