Python 将数据写入已调整大小的hdf5数据集失败的方式令人惊讶

Python 将数据写入已调整大小的hdf5数据集失败的方式令人惊讶,python,hdf5,h5py,Python,Hdf5,H5py,我正在尝试创建一个数据集,但我最初不知道数据集的完整大小 我使用以下属性创建数据集 文件['data'],创建数据集( name='test',shape=(10,len(arr1)), maxshape=(10,无),dtype=float, scaleoffset=3,chunks=True, compression='gzip',compression_opts=4,fillvalue=np.nan) 其中,形状中的最终尺寸是我需要展开的尺寸(第一次输入给出的初始形状) 当我为arr2调

我正在尝试创建一个数据集,但我最初不知道数据集的完整大小

我使用以下属性创建数据集

文件['data'],创建数据集(
name='test',shape=(10,len(arr1)),
maxshape=(10,无),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(0233,step=1,dtype=float)
arr3=np.arange(0,50000,步长=1,数据类型=float)
file=h5py.file(我的数据文件'w')
文件。创建_组(“数据”)
文件['data']。创建\u数据集(
name='test',shape=(10,len(arr1)),
maxshape=(10,无),dtype=float,
scaleoffset=3,chunks=True,
compression='gzip',compression_opts=4,fillvalue=np.nan)
文件['data']['test'][0,:len(arr1)]=arr1
尝试:
文件['data']['test'][1,:len(arr2)]=arr2
除类型错误为e外:
打印('新数据对于旧数据集太大,正在调整')
文件['data']['test'].resize((10,len(arr2)))
文件['data']['test'][1,:len(arr2)]=arr2
如果我停在这里,一切看起来都和预期的一样,但是当我运行下面的代码时,主要问题出现了

试试看:
文件['data']['test'][2,:len(arr3)]=arr3
除类型错误为e外:
打印('新数据对于旧数据集太大,正在调整')
文件['data']['test'].resize((10,len(arr3)))
文件['data']['test'][2,:len(arr3)]=arr3

我运行了一些测试进行诊断。首先,我运行了3个单独的步骤,我看到的行为与您描述的不同。
测试1:仅限arr1
仅将
arr1
添加到第0行并关闭文件:
第0行具有正确的
arr1
值,第1-9行填充
0.0
,而不是
NaN

测试2:arr1和arr2
arr1
添加到第0行,调整大小,然后将
arr2
添加到第1行,并关闭文件:
对于第0-99列:第0行和第1行填充,第2-9行填充0.0,而不是
NaN
。对于所有行,100+列都是
=NaN
。请注意,
arr2
values>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\u opts=4
。 生成的HDF5文件看起来与预期完全一样,没有添加
NaN
everywhere数据(第0行,第100+列;第1行,第233+列以及第3-9行中的所有列)。请参阅下面的修改呼叫:

h5f['data'].create_dataset(
   name='test', shape=(10, len(arr1)), 
   maxshape=(10, None), dtype=float, fillvalue=np.nan) 

我对删除的4个参数了解得不够,无法解释为什么会这样——只是它确实如此

我做了一些测试来诊断。首先,我运行了3个单独的步骤,我看到的行为与您描述的不同。
测试1:仅限arr1
仅将
arr1
添加到第0行并关闭文件:
第0行具有正确的
arr1
值,第1-9行填充
0.0
,而不是
NaN

测试2:arr1和arr2
arr1
添加到第0行,调整大小,然后将
arr2
添加到第1行,并关闭文件:
对于第0-99列:第0行和第1行填充,第2-9行填充0.0,而不是
NaN
。对于所有行,100+列都是
=NaN
。请注意,
arr2
values>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\u opts=4
。 生成的HDF5文件看起来与预期完全一样,没有添加
NaN
everywhere数据(第0行,第100+列;第1行,第233+列以及第3-9行中的所有列)。请参阅下面的修改呼叫:

h5f['data'].create_dataset(
   name='test', shape=(10, len(arr1)), 
   maxshape=(10, None), dtype=float, fillvalue=np.nan) 

我对删除的4个参数了解得不够,无法解释为什么会这样——只是它确实如此

感谢您的回复,进一步查看文档,
scaleoffset
选项似乎不适用于特殊的浮点型值(即
Inf
NaN
)。我相信当数据被“分块”时,它会将
NaN
转换为0