如何将我自己的类对象存储到hdf5中?

2023-12-21

我创建了一个类来保存我的研究的实验结果(我是一名电子工程博士生),例如

class Trial:
    def __init__(self, subID, triID):
        self.filePath = '' # file path of the folder
        self.subID = -1    # int
        self.triID = -1    # int
        self.data_A = -1   # numpy array
        self.data_B = -1   # numpy array
        ......

它是许多 bool、int 和 numpy 数组的混合。你明白了。我读到如果数据是 hdf5 格式,加载速度会更快。我可以用我的数据来做这件事吗,这是我的Python列表Trial object?

请注意,有一个类似的问题 https://stackoverflow.com/questions/39124934/can-i-store-my-own-class-object-into-hdf5在堆栈溢出上。但它只有一个答案,并不能回答问题。相反,它将 OP 的自定义类分解为基本数据类型并将它们存储到单独的数据集中。我并不反对这样做,但我想知道这是否是唯一的方法,因为它违背了面向对象的哲学。


我尚未测试以下解决方案的速度和存储功效。 HDF5 确实支持“复合数据类型”,可与 numpy“结构化数组”一起使用,后者支持混合变量类型,例如在类对象中遇到的变量类型。

"""
Created on Tue Dec 10 21:26:54 2019

@author: Christopher J. Burke
Give a worked example of saving a list of class objects with mixed
storage types to a HDF5 file and reading in file back to a list of class
objects.  The solution is inspired by this bug report
https://github.com/h5py/h5py/issues/735
and the numpy and hdf5 documentation
"""

import numpy as np
import h5py

class test_object:
    """ Define a storage class that keeps info that we want to record
      for every object
    """
    # explictly state the name, datatype and shape for every
    #  class variable
    #  The names MUST exactly match the class variable names in the __init__
    store_names = ['a', 'b', 'c', 'd', 'e']
    store_types = ['i8', 'i4', 'f8', 'S80', 'f8']
    store_shapes = [None, None, None, None, [4]]
    # Make the tuples that will define the numpy structured array
    # https://docs.scipy.org/doc/numpy/user/basics.rec.html
    sz = len(store_names)
    store_def_tuples = []
    for i in range(sz):
        if store_shapes[i] is not None:
            store_def_tuples.append((store_names[i], store_types[i], store_shapes[i]))
        else:
            store_def_tuples.append((store_names[i], store_types[i]))
    # Actually define the numpy structured/compound data type
    store_struct_numpy_dtype = np.dtype(store_def_tuples)

    def __init__(self):
        self.a = 0
        self.b = 0
        self.c = 0.0
        self.d = '0'
        self.e = [0.0, 0.0, 0.0, 0.0]

    def store_objlist_as_hd5f(self, objlist, fileName):
        """Function to save the class structure into hdf5
        objlist -  is a list of the test_objects
        fileName - is the h5 filename for output
        """        
        # First create the array of numpy structered arrays
        np_dset = np.ndarray(len(objlist), dtype=self.store_struct_numpy_dtype)
        # Convert the class variables into the numpy structured dtype
        for i, curobj in enumerate(objlist):
            for j in range(len(self.store_names)):
                np_dset[i][self.store_names[j]] = getattr(curobj, self.store_names[j])
        # Data set should be all loaded ready to write out
        fp = h5py.File(fileName, 'w')
        hf_dset = fp.create_dataset('dset', shape=(len(objlist),), dtype=self.store_struct_numpy_dtype)
        hf_dset[:] = np_dset
        fp.close()

    def fill_objlist_from_hd5f(self, fileName):
        """ Function to read in the hdf5 file created by store_objlist_as_hdf5
          and store the contents into a list of test_objects
          fileName - si the h5 filename for input
         """
        fp = h5py.File(fileName, 'r')
        np_dset = np.array(fp['dset'])
        # Start with empty list
        all_objs = []
        # iterate through the numpy structured array and save to objects
        for i in range(len(np_dset)):
            tmp = test_object()
            for j in range(len(self.store_names)):
                setattr(tmp, self.store_names[j], np_dset[i][self.store_names[j]])
            # Append object to list
            all_objs.append(tmp)
        return all_objs

if __name__ == '__main__':

    all_objs = []    
    for i in range(3):
        # instantiate tce_seed object
        tmp = test_object()
        # Put in some dummy data into object
        tmp.a = int(i)
        tmp.b = int(i)
        tmp.c = float(i)
        tmp.d = '{0} {0} {0} {0}'.format(i)
        tmp.e = np.full([4], i, dtype=np.float)
        all_objs.append(tmp)

    # Write out hd5 file
    tmp.store_objlist_as_hd5f(all_objs, 'test_write.h5')

    # Read in hd5 file
    all_objs = []
    all_objs = tmp.fill_objlist_from_hd5f('test_write.h5')

    # verify the output is as expected
    for i, curobj in enumerate(all_objs):
        print('Object {0:d}'.format(i))
        print('{0:d} {1:d} {2:f}'.format(curobj.a, curobj.b, curobj.c))
        print('{0} {1}'.format(curobj.d.decode('ASCII'), curobj.e))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将我自己的类对象存储到hdf5中? 的相关文章

  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Spider 必须返回 Request、BaseItem、dict 或 None,已“设置”

    我正在尝试从以下位置下载所有产品的图像 我的蜘蛛看起来像 from shopclues items import ImgData import scrapy class multipleImages scrapy Spider name m
  • Python:Goslate 翻译请求返回“503:服务不可用”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 这个问题似乎不是关于主要由程序员使用的特定编程问
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv

随机推荐

  • 如何从一张画布复制到另一张画布

    我想复制在一张画布上绘制的图像 details http developer android com reference android graphics Canvas html 进入另一个画布 通常讨论的使用位图的解决方案将不起作用 因为
  • Django ORM - 百分号代表类似

    在我的网站上 用户应该能够过滤数字 例如 123 321 这将匹配 666123 555 321111 或LIKE 123 321 默认情况下django的orm转义 sign https docs djangoproject com en
  • 等待多张图片加载

    我有多个图像要加载 并将它们放入一个数组中 在循环中 加载图像时我会增加计数器 当这个计数器等于我的图像的数组长度时 我想删除加载指示器 我不知道为什么 这不起作用 new Vue el app created let imageLoade
  • Angular 4 服务中的数据,传递给组件

    服务中有一些数据 当我在服务上的对象中有数据时 它工作得很好 但现在我已经连接了数据库连接 数据永远不会到达组件 我希望该服务订阅从数据库返回的数据并定义如下调用 public setPerson ac string void consol
  • 高请求场景下Java Threadpool vs. new Thread

    我有一些用于 REST 服务的旧 Java 代码 该服务对每个传入请求使用单独的线程 IE 主循环将在 socket accept 上循环并将套接字移交给 Runnable 然后 Runnable 将启动自己的后台线程并调用自身运行 这在一
  • 将执行文本/模板模板的结果分配给变量[重复]

    这个问题在这里已经有答案了 type Inventory struct Material string Count uint sweaters Inventory wool 17 tmpl err template New test Par
  • iPhone - 不同应用程序有相同的配置文件吗?

    您可以使用相同的配置文件为 App Store 编译 2 个不同的应用程序吗 我想不是 但只是想知道 我非常确定您不能在 App Store 提交的 appID 中使用通配符 您可以使用类似的方法构建和调试所有应用程序GK46RTKQ4V
  • 通过查询查找组中的最后一行-SQL Server

    我在 SQL Server 中有表 我想找到每组中的最后一行 我尝试使用以下查询 但它没有返回准确的结果 ID列是PK 其他列设置为NOT NULL select ID Name FROM select ID Name max ID ove
  • Rails distance_of_time_in_words 返回“en, about_x_hours”

    我遇到了一个奇怪的问题 希望有人知道问题是什么 使用 distance of time in words 以及 time ago in words 不会返回实际的时间距离 相反 它返回诸如 en about x hours 或 en x m
  • 如何使用 Xcode 4.2 使用 ios 4.2 基础 sdk?

    如何使用 Xcode 4 2 使用 ios 4 2 基础 sdk 我拥有一部 iPhone 4s 和一部装有 ios 4 2 的 iTouch 将 Xcode 升级到 4 2 以与我的 iPhone 4s 配合使用后 我无法再将 Xcode
  • 在 Amazon EC2 微实例中运行 Play 框架应用程序

    我有一个非常基本的玩法 应用程序只处理几个正常的 GET 和 POST 请求并与 MySQL 数据库对话 没什么花哨的 I ran play dist并将 zip 文件传输到我的 EC2 实例 解压后 进入bin文件夹并运行 myapp 我
  • 解析来自 http get 的多部分响应

    我正在开发两个应用程序之间的集成 应用程序 1 使用 HttpClient GetMethod 向应用程序 2 发出请求 应用程序 2 将返回嵌入文件的多部分响应 我认为这是一个简单的练习 但似乎找不到解析 HTTP GET 的多部分响应的
  • Ngrx Effects 规范抛出错误“未初始化测试调度程序”

    尝试使用现有的和最近迁移的 Angular 7 项目运行简单的效果测试 但我收到如下错误 错误 未初始化测试调度程序在 getTestScheduler node modules jasmine marbles es6 src schedu
  • android中如何实现下拉刷新?

    目前我正在开发一个片段 它只是一个带有框架布局的网络视图 问题是 我想做类似的事情下拉刷新 就像列表视图中常见的一些刷新功能一样 假设有一个refreshToDo 功能 我所需要的只是一个布局 当我拖动主体时 它会显示刷新标题 当标题达到一
  • 通过 PHP 显示数据库中的 Base64 图像

    我有这个数据库 其中包含图像作为字符串 这些字符串看起来像这样 data image jpeg base64 9j 4AAQSkZJRgABAQEAYABgAAD 我需要创建一个显示该图像的链接 喜欢something com id 27是
  • Geb 的一般问题(StaleElementReferenceException 和等待超时)

    根据 Geb之书 我开始绘制我们门户网站的网页 我更喜欢使用静态内容闭包块中定义的变量 然后在页面方法中访问它们 static content buttonSend input type submit nicetitle Senden de
  • 为什么有用于 socket()、connect()、send() 等的 WSA 挂件,但没有用于 closesocket() 的 WSA 挂件?

    我将尝试用几个例子来解释我的意思 套接字 gt WSASocket 连接 gt WSAConnect 发送 gt WSASend sendto gt WSASendTo recv gt WSARecv recvfrom gt WSARecv
  • 使用 ElementTree 将 xml 转换为字典

    我正在寻找使用 ElementTree 的 XML 到字典解析器 我已经找到了一些 但它们排除了属性 在我的例子中 我有很多属性 以下 XML to Python dict 片段解析实体以及以下属性这个 XML 到 JSON 规范 http
  • 如何在 Tomcat 中创建不使用池化的数据源

    我使用 JNDI 上下文在 Tomcat 的 context xml 文件中为 JDBC 驱动程序创建数据源 如下所示
  • 如何将我自己的类对象存储到hdf5中?

    我创建了一个类来保存我的研究的实验结果 我是一名电子工程博士生 例如 class Trial def init self subID triID self filePath file path of the folder self subI