首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从h5文件组初始化或填充多个numpy数组

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

Stack Overflow用户
提问于 2018-06-19 07:02:23
回答 1查看 195关注 0票数 0

我有一个包含5个组的h5文件,每个组包含一个3D数据集。我希望构建一个for循环,它允许我将每个组提取到一个numpy数组中,并将该numpy数组分配给一个具有组头名称的对象。我可以在一个组中使用许多不同的方法,但是当我尝试构建一个for循环来应用于所有5个组的代码时,它就会崩溃。例如:

代码语言:javascript
复制
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循环应用相同的逻辑时:

代码语言:javascript
复制
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数组:

代码语言:javascript
复制
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循环时,它就崩溃了。

如有任何建议,欢迎光临!

EN

回答 1

Stack Overflow用户

发布于 2018-06-19 07:15:21

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

代码语言:javascript
复制
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的值

代码语言:javascript
复制
alist = [1,2,3]
for i in alist:
    print(i)
    i = 10
    print(i)
print(alist)       # no change to alist

f是该文件。

代码语言:javascript
复制
FFM = f['FFM'] 

是一个group

代码语言:javascript
复制
Amp = FFM['Amp']

是一个数据集。有多种方法可以将数据集加载到numpy数组中。我相信[...]切片是当前的首选。.value过去使用,但现在是deprecated (loading dataset)

代码语言:javascript
复制
Amp = FFM['Amp'][...]

是一个数组。

代码语言:javascript
复制
alist = [FFM[key][...] for key in h5_keys]

应从FFM组创建阵列列表。

如果形状兼容,则可以将数组连接成一个数组:

代码语言:javascript
复制
np.array(alist)
np.stack(alist)
np.concatatenate(alist, axis=0)   # or other axis

代码语言:javascript
复制
adict = {key: FFM[key][...] for key in h5_keys}

应创建以数据集名称为关键字的数组字典。

在Python中,列表和字典是累积对象的方式。h5py组的行为很像字典。Datasets的行为与numpy数组非常相似,只是它们会一直保留在磁盘上,直到加载了[...]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50918538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档