如何在Julia中阅读复杂的HDF5阵列?

时间:2014-10-07 01:18:52

标签: hdf5 julia

我有许多包含复数数组的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 个答案:

答案 0 :(得分:2)

我以前没有想过这个,但一个解决方案就是将h5py与PyCall一起使用:

using PyCall
@pyimport h5py

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

println(mat)

答案 1 :(得分:2)

正如@simonster指出的那样,有一种快速而安全的方法可以做到这一点。

如果你写了:

a = read(fd, "mat"))

然后你想要的复杂矢量就是:

cx_vec = reinterpret(Complex{Float64}, a.data)

答案 2 :(得分:0)

在Julia 0.6中,您可以执行以下操作。只要您已经安装了HDF5模块和DataFrame,此示例就可以立即执行,因为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。