我在同一个文件my_file.h5中保存了多个HDF5数据集。这些数据集具有不同的维度,但在第一个维度中的观察数相同:

features.shape = (1000000, 24, 7, 1)
labels.shape = (1000000)
info.shape = (1000000, 4)

重要的是,信息/标签数据必须正确连接到每组功能,因此我想使用相同的种子对这些数据集进行混洗。此外,我想在不将它们完全加载到内存中的情况下对其进行改组。可以使用numpy和h5py吗?

最佳答案

像这样在numpy中改组数组很简单

创建大的改编索引(shuffle np.arange(1000000))并索引数组

features = features[I, ...]
labels = labels[I]
info = info[I, :]

这不是就地操作。 labels[I]labels的副本,而不是切片或 View 。

替代
features[I,...] = features

在表面上看起来像是就地操作。我怀疑是在C代码中。它必须被缓冲,因为I的值不能保证是唯一的。实际上,有一种特殊的ufunc .at方法用于无缓冲操作。

但是,看看h5py对这种“花式索引”的看法:

http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing
labels[I]选择已实现,但有限制。
List selections may not be empty
Selection coordinates must be given in increasing order
Duplicate selections are ignored
Very long lists (> 1000 elements) may produce poor performance

根据定义,混洗的I的排列顺序不是递增的。而且非常大。

我也没有看到关于在左手边使用这个华丽的索引labels[I] = ...的任何信息。

关于python - 就地改组多个HDF5数据集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30977494/

10-09 00:35
查看更多