我正在尝试创建一个我最初不知道完整大小的数据集。
我创建具有以下属性的数据集。
file['data'].create_dataset(
name='test', shape=(10, len(arr1)),
maxshape=(10, None), dtype=float,
scaleoffset=3, chunks=True,
compression='gzip', compression_opts=4, fillvalue=np.nan)
其中形状的最终尺寸是我需要扩展的尺寸(由第一个输入指定的初始形状)。
当我为arr2调整数据集的大小时,一切工作正常,但是当我尝试将其扩展为arr3的更大尺寸时,事情就会开始表现出异常。
如果我逐步调整大小并依次写每个数组,则数据集的内容将损坏,并且将第一个数组长度(arr1
)以外的值(在这种情况下为100)写入填充值(nan
),而前100个值已正确存储。请注意,在调整大小和写入arr2
时不会发生这种情况,这将正确写入arr2
的所有值,同时用nan
扩展第一个条目。
我也尝试过手动增加块大小,但是当我写较小的数组时,除非使用了正确的填充值(默认为0,而不是nan
),否则将失败,除非块大小显着变大与最大数组相比,最大数组仍会被截断为块大小之外的填充值。
arr1 = np.arange(0, 100, step=1, dtype=float)
arr2 = np.arange(0, 233, step=1, dtype=float)
arr3 = np.arange(0, 50000, step=1, dtype=float)
file = h5py.File(my_data_file, 'w')
file.create_group('data')
file['data'].create_dataset(
name='test', shape=(10, len(arr1)),
maxshape=(10, None), dtype=float,
scaleoffset=3, chunks=True,
compression='gzip', compression_opts=4, fillvalue=np.nan)
file['data']['test'][0, :len(arr1)] = arr1
try:
file['data']['test'][1, :len(arr2)] = arr2
except TypeError as e:
print('New data too large for old dataset, resizing')
file['data']['test'].resize((10, len(arr2)))
file['data']['test'][1, :len(arr2)] = arr2
如果我在这里停止,一切都会按预期进行,但是主要的问题出现在我运行以下代码时。
try:
file['data']['test'][2, :len(arr3)] = arr3
except TypeError as e:
print('New data too large for old dataset, resizing')
file['data']['test'].resize((10, len(arr3)))
file['data']['test'][2, :len(arr3)] = arr3
答案 0 :(得分:0)
我进行了一些测试以进行诊断。首先,我执行了3个单独的步骤,发现行为与您描述的不同。
测试1:仅arr1
仅将arr1
添加到第0行并关闭文件:
第0行具有正确的arr1
值,第1-9行由0.0
而非NaN
填充。
测试2:arr1和arr2
在第0行中添加arr1
,调整大小,然后在第1行中添加arr2
,然后关闭文件:
对于第0-99列:填充第0行和第1行,并填充第2行至第9行,而不是NaN
。 100+列都是=NaN
,代表所有行。请注意,文件中没有arr2
值>99。
测试3:arr1,arr2,arr3
按照上述过程加载所有3个数组:
与测试2相似的结果:对于第0-99列:第0,1,2行填充,第3-9行填充0.0,而不是NaN
。 100+列都是=NaN
,代表所有行。请注意,文件中没有arr2
和arr3
值> 99。
然后我在修改create_dataset()
后重新运行测试3 ;删除以下参数:scaleoffset=3, chunks=True, compression='gzip', compression_opts=4
。
生成的HDF5文件看起来与预期的完全一样,在没有添加数据的所有地方(行0,列100+,行1,列233+,以及行3-9中的所有列)中,NaN
都与预期的一样。请参阅下面的修改后的通话:
h5f['data'].create_dataset(
name='test', shape=(10, len(arr1)),
maxshape=(10, None), dtype=float, fillvalue=np.nan)
我对这4个删除的参数了解得不够多,无法解释为什么它起作用-只有它能起作用。