【问题标题】:Initializing or populating multiple numpy arrays from h5 file groups从 h5 文件组初始化或填充多个 numpy 数组
【发布时间】:2018-06-19 07:31:57
【问题描述】:

我有一个包含 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' 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: too many indices for array”

我也尝试过生成字典并从字典中创建 numpy 数组。这是一个类似的故事,我可以让代码为一个 h5 组工作,但是当我构建 for 循环时它就崩溃了。

欢迎提出任何建议!

【问题讨论】:

  • 在您的第二次 sn-p 中,您永远不会创建 Amp。在您的第三个中,您永远不会为 Amp 分配任何东西。你习惯用matlab吗?与 Matlab 不同,变量不会从一次运行到下一次“停留”。如果您执行第一个 sn-p 代码,所有这些变量都会在执行结束时消失。

标签: python numpy h5py


【解决方案1】:

在学习 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 以前用过,现在是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 数组,尽管它们会保留在磁盘上,直到加载 [...]

【讨论】:

  • 我在一个学校项目中陷入了困境,我肯定缺乏 python 经验。因此,您在简单的 for 循环示例中得到的是我在 for 循环中进行操作,但实际上并未将这些操作应用于我在循环之外启动的数组。如果我追求使用的方法:alist = [FFM[key][...] for key in h5_keys] 我得到一个包含所有 5 个数据集的数组。我想将数据集分开,并将每个数据集分配给一个唯一的名称,以便稍后在代码中使用。感谢陌生人的帮助!
  • alist 是一个包含 5 个数组的列表(技术上不是数组)。我还展示了如何在字典中收集这些内容。在 Python 中动态创建变量并不容易,也不推荐。那是在做 `Amp=FFM['Amp'][...]; Drive = ....' 等 5 个键中的每一个。换句话说,不要尝试将每个数据集分配给不同的变量名称。这不是 Pythonic 做事的方式。使用列表和字典。
  • 我明白了,所以如果我创建了字典并且稍后在我的代码中需要该对象,我将使用dict["Amp"]。只是好奇,这是保持命名空间整洁的更好做法的原因吗?
猜你喜欢
  • 2011-08-18
  • 2020-12-28
  • 1970-01-01
  • 2018-12-04
  • 2018-10-29
  • 2011-05-30
  • 2020-10-25
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多