gpt4 book ai didi

python - 将数据写入调整大小的 hdf5 数据集会以令人惊讶的方式失败

转载 作者:太空宇宙 更新时间:2023-11-03 20:37:22 25 4
gpt4 key购买 nike

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

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

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 扩展第一个条目.

我也尝试过手动增加 block 大小,但是当我写入较小的数组时,这无法使用正确的填充值(默认为 0,而不是 nan),除非 block 大小明确大于最大数组,最大数组仍被截断为 block 大小之外的填充值。

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

最佳答案

我进行了一些测试来诊断。首先,我运行了 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 值 > 99 不在文件中。
测试3:arr1、arr2、arr3
按照上述过程加载所有 3 个数组:
与测试 2 类似的结果:对于第 0-99 列:填充第 0、1、2 行,第 3-9 行填充 0.0,而不是 NaN。对于所有行,第 100 多列均为 =NaN。请注意,arr2arr3 值 > 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 个删除的参数了解不够,无法解释为什么它会起作用——只能说它确实有效。

关于python - 将数据写入调整大小的 hdf5 数据集会以令人惊讶的方式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57086124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com