h5py 在索引中返回意外结果
h5py returning unexpected results in indexing
我正在尝试用我按顺序生成的一系列 numpy 数组填充 h5py 数据集,以便我的内存可以处理它。
h5py 数组已初始化,因此第一个维度可以具有任何大小,
f.create_dataset('x-data', (1, maxlen, 50), maxshape=(None, maxlen, 50))
生成每个 numpy 数组 X 后,我正在使用
f['x-data'][alen:alen + len(data),:,:] = X
例如,在第一个数组中,alen=0 和 len(data)=10056。然后我增加 alen,这样下一个数组将从最后一个数组结束的地方开始。
print f['x-data'][alen:alen + len(data),:,:].shape, alen, len(data)
(1L, 60L, 50L) 0 10056
有谁知道为什么 0:10056 索引被解释为 1L?
我复制了你的例子,但规模要小得多。每次添加元素时我都必须调整大小,例如
f['xdata'].resize(50,axis=0)
我第一次尝试添加块时出现错误:
TypeError: Can't broadcast (10, 20, 10) -> (1, 20, 10)
但后来,当我超出分配的 space 时,它无声地失败了。没有错误,它只是没有最终存储新值。
这是版本 2.2.1
我从用户组中一位乐于助人的人那里找到了答案。
maxshape(None) 功能并不意味着数据集会自动调整大小 - 每次添加新输入时都必须调整大小。所以在添加新数据之前必须增加第一个维度:
x.resize((x.shape[0] + X.shape[0], X.shape[1], X.shape[2]))
y.resize((y.shape[0] + Y.shape[0], Y.shape[1], Y.shape[2]))
然后数据集会正确添加值。
我正在尝试用我按顺序生成的一系列 numpy 数组填充 h5py 数据集,以便我的内存可以处理它。
h5py 数组已初始化,因此第一个维度可以具有任何大小,
f.create_dataset('x-data', (1, maxlen, 50), maxshape=(None, maxlen, 50))
生成每个 numpy 数组 X 后,我正在使用
f['x-data'][alen:alen + len(data),:,:] = X
例如,在第一个数组中,alen=0 和 len(data)=10056。然后我增加 alen,这样下一个数组将从最后一个数组结束的地方开始。
print f['x-data'][alen:alen + len(data),:,:].shape, alen, len(data)
(1L, 60L, 50L) 0 10056
有谁知道为什么 0:10056 索引被解释为 1L?
我复制了你的例子,但规模要小得多。每次添加元素时我都必须调整大小,例如
f['xdata'].resize(50,axis=0)
我第一次尝试添加块时出现错误:
TypeError: Can't broadcast (10, 20, 10) -> (1, 20, 10)
但后来,当我超出分配的 space 时,它无声地失败了。没有错误,它只是没有最终存储新值。
这是版本 2.2.1
我从用户组中一位乐于助人的人那里找到了答案。
maxshape(None) 功能并不意味着数据集会自动调整大小 - 每次添加新输入时都必须调整大小。所以在添加新数据之前必须增加第一个维度:
x.resize((x.shape[0] + X.shape[0], X.shape[1], X.shape[2]))
y.resize((y.shape[0] + Y.shape[0], Y.shape[1], Y.shape[2]))
然后数据集会正确添加值。