python - 如果数据集属性是嵌套数组,则无法修改它

标签 python h5py

this HDF5 ,我需要更新第一行属性

h5['Model/dataset'].attrs['num_cells']

因此,我执行以下操作:

import h5py

h5 = h5py.File('MCPL507_HS_3_2_orig.newrom','a')
numcells = h5['Model/dataset'].attrs['num_cells'][:]

#Print before re-assigment
print numcells[0]
print type(numcells[0])

numcells[0] = [230,230,30]

#Print after re-assigment
print numcells[0]
print type(numcells[0])

h5['Model/dataset'].attrs.modify('num_cells',numcells)

这引发了我的异常:

File "C:\Users\nnolde\PycharmProjects\HDF5_Stuff\MinExample.py", line 16, in <module>
    h5['Model/dataset'].attrs.modify('num_cells',numcells)
  File "C:\Anaconda2\lib\site-packages\h5py\_hl\attrs.py", line 221, in modify
    raise TypeError("Shape of data is incompatible with existing attribute")
TypeError: Shape of data is incompatible with existing attribute

该属性似乎使用了某种比例/维度,因为您无法修改数据的形状?!我什至不改变数组形状,只改变几个元素。我认为属性是任意的,只要您不尝试更改数据类型(或数组形状),您就可以根据需要进行修改。或者这是一些 Python/C 端口错误?

注意:我无法使用 __setitem__,这将导致我们的自定义应用程序不再识别 HDF5。

有人知道可能是什么问题,甚至可能如何解决它吗?

最佳答案

检查 HDF5 文件时:

enter image description here

您会看到 num_cells 是数组(大小 3)的嵌套数组(大小 3)。

但是,在Python中阅读之后。

h5 = h5py.File('MCPL507_HS_3_2_orig.newrom','a')
numcells = h5['Model/dataset'].attrs['num_cells']
print(numcells.shape)

numcells的形状为(3,3),这意味着h5py在读取属性时将嵌套的线性数组变为二维数组。

即使不进行修改,只需使用 modify(name, value) 将其写回即可得到“数据形状与现有属性不兼容”错误。

您可以读取该属性,修改它并将其分配回来,如下所示:

numcells = h5['Model/dataset'].attrs['num_cells']
numcells[0] = [230,230,30]
h5['Model/dataset'].attrs['num_cells'] = numcells

但这会将 HDF5 文件中属性的形状更改为 3x3(无论如何你说你不能使用它):

enter image description here

所以我尝试欺骗 h5py 并将属性拆分为三个一维数组来手动创建那里的内容,然后再次设置它:

numcells = h5['Model/dataset'].attrs['num_cells']
numcells[0] = [230,230,30]
dummy = [numcells[0], numcells[1], numcells[2]]
h5['Model/dataset'].attrs['num_cells'] = dummy

但 h5py 更清楚并再次将它们转换为 3x3 数组!

摘要:

h5py 在读取和写入属性时将嵌套数组转换为更高维的 numpy 数组,并且如果属性是嵌套数组,则不允许在不更改形状的情况下修改属性。这可以被视为一个错误。您能做的最好的事情就是避免嵌套数组,而使用高维数组作为属性形状,因为可以修改它们而不会引发错误。

关于python - 如果数据集属性是嵌套数组,则无法修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37351267/

相关文章:

python - h5py:如何使用keys()循环HDF5组和数据集

Python:将 setup.py "scripts="迁移到 entry_points

python - 如何模拟导入实例的方法

python - 导入错误: DLL load failed while importing defs: The specified procedure could not be found

python - HDF5 可能的数据损坏或丢失?

python - 无法创建组(没有对文件的写入意图)

python - 如何在 HDF5 数据集中存储字典

python - 代码与前面的行相同,但给出了错误?

python - 在文件中查找并替换

python - 同步目录树算法辅助