我有一个包含5个组的h5文件,每个组包含一个3D数据集。我希望构建一个for循环,允许我将每个组提取到一个numpy数组,并将numpy数组分配给具有组头名称的对象。我可以使用一些不同的方法来处理一个组,但是当我尝试构建一个适用于所有5个组的代码的for循环时,它会中断。例如:
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'未定义"。我尝试在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循环时,它就崩溃了。
任何建议都表示赞赏!
答案 0 :(得分:1)
在学习Python的大部分内容之前,您似乎已经跳过使用h5py
和numpy
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 alist
f
是文件。
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
组的行为与词典非常相似。数据集的行为与numpy数组非常相似,但在加载[...]
之前它们仍保留在磁盘上。