Why does h5py throw an error when adding 3 variable length strings to a dataset?(为什么h5py在向数据集中添加3个可变长度的字符串时会抛出错误?)
                            本文介绍了为什么h5py在向数据集中添加3个可变长度的字符串时会抛出错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
                        
                        问题描述
我正在尝试使用h5py(Python3)设置和写入HDF5数据集,该数据集包含复合对象的一维数组。每个复合对象由三个长度可变的字符串属性组成。     with h5py.File("myfile.hdf5", "a") as file:
         dt = np.dtype([
             ("label", h5py.string_dtype(encoding='utf-8')),
             ("name", h5py.string_dtype(encoding='utf-8')),
             ("id", h5py.string_dtype(encoding='utf-8'))])
         dset = file.require_dataset("initial_data", (50000,), dtype=dt)
         dset[0, "label"] = "foo"
当我运行上面的示例时,最后一行代码导致h5py(或者更准确地说,numpy)抛出一个错误:
无法更改对象数组的数据类型。
我是否正确理解为"foo"的类型不是h5py.string_dtype(encoding='utf-8')?
为什么?我如何修复此问题?
更新1: 进入堆栈跟踪,我可以看到错误是由名为_view_is_safe(oldtype, newtype)的内部NumPy函数抛出的。在我的例子中,oldtype是dtype('O'),但newtype是dtype([('label', 'O')]),这会导致引发错误。
更新2: 下面已成功回答了我的问题,但为了完整起见,我链接到一个可能与以下内容相关的GH问题:https://github.com/h5py/h5py/issues/1921
推荐答案
您将dtype设置为可变长度字符串的元组,因此您需要一次性设置该元组。通过仅设置Label元素,不会设置其他两个元组值,因此它们不是字符串类型。
示例:
import h5py
import numpy as np
with h5py.File("myfile.hdf5", "a") as file:
    dt = np.dtype([
        ("label", h5py.string_dtype(encoding='utf-8')),
        ("name", h5py.string_dtype(encoding='utf-8')),
        ("id", h5py.string_dtype(encoding='utf-8'))])
    dset = file.require_dataset("initial_data", (50000,), dtype=dt)
#Add a row of data with a tuple:
    dset[0] = "foo", "bar", "baz"
 
#Add another row of data with a np recarray (1 row):
    npdt = np.dtype([
        ("label", 'S4'),
        ("name", 'S4'),
        ("id", 'S4') ])
    dset[1] = np.array( ("foo1", "bar1", "baz1"), dtype=npdt )
       
#Add 3 rows of data with a np recarray (3 rows built from a list of arrays):
    s1 = np.array( ("A", "B", "C"), dtype='S4' )
    s2 = np.array( ("a", "b", "c"), dtype='S4' )
    s3 = np.array( ("X", "Y", "Z"), dtype='S4' )
    recarr = np.rec.fromarrays([s1, s2, s3], dtype=npdt)
    dset[2:5] = recarr
结果1:
全部三种方法的结果:
这篇关于为什么h5py在向数据集中添加3个可变长度的字符串时会抛出错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
				 沃梦达教程
				
			本文标题为:为什么h5py在向数据集中添加3个可变长度的字符串
				
        
 
            
        
             猜你喜欢
        
	     - 如何防止Groupby超越指数? 2022-09-22
 - 使用带有CROSS_VAL_SCORE的自定义估计器失败 2022-09-21
 - 合并具有多个索引和列值的数据帧 2022-09-22
 - 将文件从Azure文件加载到Azure数据库 2022-09-21
 - 如何命名HDF5数据集中的列? 2022-09-21
 - 如何将属性添加到作为组存储在HDF5文件中的 pa 2022-09-21
 - 基于多个一级列的子集多索引DataFrame 2022-09-22
 - 为什么切换屏幕在Kivy中不起作用? 2022-09-21
 - H5py:如何在HDF5组和数据集上使用key()循环 2022-09-21
 - 获取多索引中某个级别的最后一个元素 2022-09-22
 
