我有许多包含复数数组的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
?
编辑:显而易见的尝试
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])
答案 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。