h5 错误: "无法打开对象(对象'data'不存在)"

3

我正在使用先前生成的3D .h5文件并取出一个2D切片。新的2D .h5文件看起来完整且符合预期,但是当我将其传递到一些建模软件(GPRMax)中时,出现错误KeyError:“无法打开对象(对象'data'不存在)”。以前的2D和3D .h5文件都很好,所以我不确定有什么不同。以下是用于生成.h5文件的代码。感谢任何帮助。

hf = h5py.File(dir_path+'\ModelMC0105\ModelA3d1_15102020_170900005701.h5', 'r')

dset = hf['data']

if os.path.exists(dir_path+'\ModelMC0105\ModelA3d1_15102020_170900005701-slice.h5'):
    os.remove(dir_path+'\ModelMC0105\ModelA3d1_15102020_170900005701-slice.h5')

hf2 = h5py.File(dir_path+'\ModelMC0105\ModelA3d1_15102020_170900005701-slice.h5','w')


dz_dy_dz = (0.001,0.001,0.001)
hf2.attrs['dx_dy_dz'] = dz_dy_dz

data = hf2.create_dataset("data", (100,1,100))

for i in range(100):
    data[i]=(dset[i,50,:])

data=data.ref
print(data)

hf2.close()
hf.close()

我正在尝试跟随你的代码。我的理解是:您在第二个HDF5文件中创建了一个形状为(100,1,100)和默认类型(float)的数据集。您读取的数据的形状是什么? (dset [i,50,:]的形状?) 另外,在for语句之后,您是否打算重新定义data? (data=data.ref) - kcw78
dest[i,50,:] 的形状是 (100,100,100)。我并没有打算重新定义数据,但这已经被删除了,并且会产生相同的错误。 - MattC1990
在您的 for 循环中,您设置了 data[i]=(dset[i,50,:])。所以如果我理解正确,您会得到 data[0]=(dset[0,50,0:100])data[1]=(dset[1,50,0:100])。您确定您的切片大小匹配(从 dsetdata)吗? - kcw78
切片大小与一个平面的初始体积相匹配。我甚至可以在HDFview中查看切片,结果也符合预期,但我无法将其读回建模软件,可能是由于格式问题? - MattC1990
很明显这些数据有所不同(显而易见)。我怀疑hf['data']hf2['data']的形状存在问题。如果不知道hf['data']的形状,很难说。我写了一个简单的切片示例并发布为“答案”。也许它会有所帮助。顺便说一句,Gig' em Aggies! :-) - kcw78
2个回答

2

请尝试使用绝对路径,这可能有效。


这不是一个答案。请考虑留下评论。 - Tyler2P
我已尝试了绝对路径,但这并没有解决问题,不过还是谢谢你的建议。 - MattC1990

0
这里有一个示例,它在HDF5文件中创建了一个['data']数据集,然后关闭文件,再重新打开(只读),并将数据分片复制到第二个HDF5文件中。也许你会找到一些有用的东西。
with h5py.File('SO_64758047.h5','w') as h5w:
    arr = np.random.random(100*480*640).reshape(100,480,640)
    ds = h5w.create_dataset('data', data=arr)   
    
with h5py.File('SO_64758047.h5','r') as h5r:
    dset = h5r['data']

    with h5py.File('SO_64758047_2.h5','w') as h5w2:
        dz_dy_dz = (0.001,0.001,0.001)
        h5w2.attrs['dx_dy_dz'] = dz_dy_dz
        data = h5w2.create_dataset('data',(100,480,640))

        for i in range(h5r['data'].shape[0]):
            print('get slice#',str(i))
            data[i] = h5r['data'][i,:,:] 

谢谢您的建议和示例,不幸的是这仍然会产生相同的错误。 - MattC1990

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