从h5文件组初始化或填充多个numpy数组

2024-03-28 16:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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循环时,它就崩溃了。你知道吗

如有任何建议,我们将不胜感激!你知道吗


Tags: key代码innumpyfornp数组keys
1条回答
网友
1楼 · 发布于 2024-03-28 16:24:16

在学习Python之前,您似乎已经开始使用h5pynumpy

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以前用过,现在是deprecatedloading 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数组非常相似,尽管它们在加载[...]之前一直保留在磁盘上。你知道吗

相关问题 更多 >