如何在Julia中读取一个复杂的HDF5数组?

4

我有许多包含复数数组的HDF5数据集,这些数据集是使用Python和h5py创建的。例如:

import numpy, h5py
with h5py.File("test.h5", "w") as f:
    f["mat"] = numpy.array([1.0 + .5j, 2.0 - 1.0j], dtype=complex)

HDF5 没有本地的复数概念,因此 h5py 将其存储为复合数据类型,并使用 "r" 和 "i" 作为实部和虚部的字段。

如何使用 HDF5.jl 在 Julia 中加载这样的复数数组?

编辑:明显的尝试是

using HDF5
h5open("test.h5", "r") do fd
    println(read(fd, "mat"))
end

返回一种晦涩难懂的响应:

HDF5Compound(Uint8[0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,64,0,0,0,0,0,0,240,191],Type[Float64,Float64],ASCIIString["r","i"],Uint64[0,8])
3个回答

2
正如@simonster所指出的,这有一种快速而安全的方法可以实现。
如果你已经写好了:
a = read(fd, "mat"))

那么你想要的复向量就是这样的:
cx_vec = reinterpret(Complex{Float64}, a.data)

2

我之前没有想过,但一个解决方法就是使用h5py和PyCall

using PyCall
@pyimport h5py

f = h5py.File("test.h5", "r")
mat = get(get(f, "mat"), pybuiltin("Ellipsis"))
f[:close]()

println(mat)

0
在Julia 0.6中,您可以执行以下操作。只要您已经安装了HDF5模块和DataFrames,此示例即可立即执行,因为example HDF5 file附带了HDF5.jl。很可能它只适用于常见类型。我还没有测试过除示例文件以外的内容,因为我仍在努力弄清楚如何从Julia编写/创建复合表。
using HDF5
using DataFrames

# Compound Table Read
d = h5read(joinpath(Pkg.dir("HDF5"),"test","test_files","compound.h5"),"/data")

# Convert d to a dataframe, D
types = [typeof(i) for i in d[1].data] # Data type list
names_HDF5 = [Symbol(i) for i in d[1].membername] # Column name list
D = DataFrame(types,names_HDF5,length(d)) # Preallocate the array
rows = length(d) # Number of rows
cols = length(d[1].data) # Number of columns
for i=1:rows
    for j=1:cols
        D[i,j] = d[i].data[j] # Save each element to the preallocated dataframe
    end
end

d是一个表格行的向量。每个元素都是HD5FCompound类型,每个类型都有三个字段:data、membername和membertype。


谢谢您!我还应该交叉参考我提交的 HDF5.jl 问题:https://github.com/JuliaIO/HDF5.jl/issues/180 - Jim Garrison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接