我有一个包含5个组的h5文件,每个组包含一个3D数据集。我希望构建一个for循环,它允许我将每个组提取到一个numpy数组中,并将该numpy数组分配给一个具有组头名称的对象。我可以在一个组中使用许多不同的方法,但是当我尝试构建一个for循环来应用于所有5个组的代码时,它就会崩溃。例如:
import h5py as h5
import numpy as np
f = h5.File("FFM0012.h5", "r+") #read in h5 file
print(list(f.keys())) #['FFM', 'Image'] for my dataset
FFM = f['FFM'] #Generate object with all 5 groups
print(list(FFM.keys())) #['Amp', 'Drive', 'Phase', 'Raw', 'Zsnsr'] for my dataset
Amp = FFM['Amp'] #Generate object for 1 group
Amp = np.array(Amp) #Turn into numpy array, this works.现在,当我尝试使用for循环应用相同的逻辑时:
h5_keys = []
FFM.visit(h5_keys.append) #Create list of group names ['Amp', 'Drive', 'Phase', 'Raw', 'Zsnsr']
for h5_key in h5_keys:
tmp = FFM[h5_key]
h5_key = np.array(tmp)
print(Amp[30,30,30]) #To check that array is populated当我运行这段代码时,我得到"NameError: name 'Amp‘is not defined“。我曾尝试在for循环之前使用以下命令初始化numpy数组:
h5_keys = []
FFM.visit(h5_keys.append) #Create list of group names
Amp = np.array([])
for h5_key in h5_keys:
tmp = FFM[h5_key]
h5_key = np.array(tmp)
print(Amp[30,30,30]) #To check that array is populated这将产生错误消息"IndexError:用于数组的索引太多“
我还尝试过生成字典和从字典创建numpy数组。这是一个类似的故事,我可以让代码为一个h5组工作,但当我构建for循环时,它就崩溃了。
如有任何建议,欢迎光临!
发布于 2018-06-19 07:15:21
在学习h5py之前,您似乎已经开始使用numpy和Python
Amp = np.array([]) # creates a numpy array with 0 elements
for h5_key in h5_keys: # h5_key is set of a new value each iteration
tmp = FFM[h5_key]
h5_key = np.array(tmp) # now you reassign h5_key
print(Amp[30,30,30]) # Amp is the original (0,) shape array尝试这个基本的python循环,注意i的值
alist = [1,2,3]
for i in alist:
print(i)
i = 10
print(i)
print(alist) # no change to alistf是该文件。
FFM = f['FFM'] 是一个group
Amp = FFM['Amp']是一个数据集。有多种方法可以将数据集加载到numpy数组中。我相信[...]切片是当前的首选。.value过去使用,但现在是deprecated (loading dataset)
Amp = FFM['Amp'][...]是一个数组。
alist = [FFM[key][...] for key in h5_keys]应从FFM组创建阵列列表。
如果形状兼容,则可以将数组连接成一个数组:
np.array(alist)
np.stack(alist)
np.concatatenate(alist, axis=0) # or other axis等
adict = {key: FFM[key][...] for key in h5_keys}应创建以数据集名称为关键字的数组字典。
在Python中,列表和字典是累积对象的方式。h5py组的行为很像字典。Datasets的行为与numpy数组非常相似,只是它们会一直保留在磁盘上,直到加载了[...]。
https://stackoverflow.com/questions/50918538
复制相似问题