【发布时间】:2019-07-19 05:36:39
【问题描述】:
我正在尝试创建一个我最初不知道完整大小的数据集。
我使用以下属性创建我的数据集。
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
【问题讨论】: