2014-10-07 2 views
2

나는 파이썬과 h5py을 사용하여 만든 복소수 배열을 포함하는 많은 HDF5 데이터 세트를 가지고 있습니다. 예를 들어 :줄리아에서 복잡한 HDF5 어레이를 읽으려면 어떻게해야합니까?

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는 복소수의 네이티브 개념, 필드 "R"과 복합 데이터 유형으로 너무 h5py 저장을하고, "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]) 

답변

1

내가 전에이 생각하지 않았다,하지만 하나 개의 솔루션은 PyCall으로 h5py 사용하는 것입니다 :

using PyCall 
@pyimport h5py 

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

println(mat) 
2

@simonster pointed 밖에서, 이것을하는 빠르고 안전한 방법이 있습니다. 당신이 쓴 경우

:

a = read(fd, "mat")) 

그런 다음 원하는 복잡한 벡터는 단순히 :

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

줄리아 0.6에서 다음과 같은 작업을 수행 할 수 있습니다. HDF5 모듈과 DataFrames가 이미 설치되어 있다면이 예제는 example HDF5 fileHDF5.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의 세 필드가 있습니다.

+0

감사합니다. 또한 HDF5.jl과 함께 제출 한 문제를 상호 참조해야합니다. https://github.com/JuliaIO/HDF5.jl/issues/180 –

관련 문제