在 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 文件时:
您会看到 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(无论如何你说你不能使用它):
所以我尝试欺骗 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/