2015-06-22 55 views
6

我有多個HDF5數據集保存在同一個文件中,my_file.h5。這些數據集有不同的尺寸,但相同數量的第一維度觀察:在原地混洗多個HDF5數據集

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

重要的是,信息/標籤數據被正確連接到每組特徵,因此我想洗牌這些數據集與一個相同的種子。此外,我想洗牌這些,而不用將它們完全加載到內存中。這可能使用numpy和h5py嗎?

回答

1

在磁盤上重新排列陣列會很耗時,因爲這意味着您已經在hdf5文件中分配新陣列,然後以不同順序複製所有行。如果要避免一次將所有數據一次加載到PyTable或h5py的內存中,您可以迭代行(或使用大塊行)。

另一種方法是將數據保持原樣並將新行號映射到單獨數組中的舊行號(您可以保持RAM完全加載,因爲數組只有4MB大小)。例如,要洗牌numpy的陣列x

x = np.random.rand(5) 
idx_map = numpy.arange(x.shape[0]) 
numpy.random.shuffle(idx_map) 

然後你可以使用advanced numpy indexing訪問您的洗牌的數據,

x[idx_map[2]] # equivalent to x_shuffled[2] 
x[idx_map] # equivament to x_shuffled[:], etc. 

這也將工作與保存到HDF5數組。當然,與在磁盤上寫入混洗陣列相比,會有一些開銷,但根據您的使用情況,這可能就足夠了。

+1

有人剛剛downvoted這2個答案。我想知道爲什麼?有人對我們說不能做的事感到失望嗎?或者是否有人有解決方案?評論通常會降低信息量。 – hpaulj

+0

可能是因爲這個問題指出「沒有將它們完全加載到內存中」。在這兩個答案中,X必須加載到內存中。 – wassname

1

像這樣numpy洗牌陣列是直線前進

創建大suffling指數(洗牌np.arange(1000000))和索引數組

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

這不是就地操作。 labels[I]labels的副本,不是片或視圖。

一種替代

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] = ...