【问题标题】:what is a fast way to output h5py dataset to text?将 h5py 数据集输出到文本的快速方法是什么?
【发布时间】:2011-03-02 12:07:12
【问题描述】:

我正在使用 h5py python 包来读取 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 列表,然后使用一些文件编写工具?

(我可以在写入文件之前尝试将值连接成一个更大的字符串,但我希望有更优雅的东西)

【问题讨论】:

  • 在 Python 中,使用range(len(dset)) 几乎总是一个坏主意。总是更喜欢迭代器,特别是因为对于大的dsetrange 实际上是创建和分配一个len(dset) 整数列表。

标签: python text hdf5 h5py


【解决方案1】:

构建一个大字符串具有节省愚蠢的“最后一次切换”的巨大优势,这要归功于优秀的join字符串方法:替换整个循环,

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

我不确定你要求你的代码有多优雅......;-)

【讨论】:

    【解决方案2】:

    你最初的怀疑是正确的,先将其转换为 Numpy 数组,然后将该数组转储为 ASCII。

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

    这将比迭代组对象本身快得多。

    【讨论】:

    • 这并未将其转换为 ascii。
    • 抱歉,请使用 my_data.tofile('my_data.txt', sep=' ', format='%f') 或更多选项使用 numpy.savetxt
    【解决方案3】:

    也许在 HDF5 文件上使用 h5dump?

    我使用(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
    

    【讨论】:

    • sudo apt-get install hdf5-tools
    【解决方案4】:

    哦,我做同样的事情,我找到了方法。 如果你想像这样访问例如

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

    这非常非常非常慢。这样做。

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

    只有这个微小的改变才能成功。

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2014-03-02
      • 2020-11-05
      • 2013-06-21
      • 2013-03-03
      • 2011-01-24
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多