2017-09-21 42 views
0

我有一個相對較大的數據集(大約8GB),並使用h5py將其讀入jupyter筆記本中。在h5py中只存儲'列'數據而不加載整個數據文件

數據集的形狀最終變成類似(50000000,384)的形狀。我的理想數據集會進行轉置,以便我可以查看數據集中的每個「列」。我能夠實現獲取每列的唯一方法是對每列進行索引(這非常緩慢且CPU密集型,因爲它在50000000行中逐行進行)或將h5數據轉換爲np.array並轉置 - 這也非常緩慢和無效。

例如,我有一個H5文件:

chunk_file = h5py.File(chunk_fil_1, "r") 

chunk_file["ex_dat"] 

輸出:

HDF5 dataset "ex_dat": shape (50000000, 384) 

如果我這樣做:

len(chunk_file["ex_dat"][0]) 

輸出:

384 

這就是我希望我的輸出成爲'0'列50000000次出現的地方。

有沒有一種有效的方式來索引h5文件的'列'像數據而不讀取每一行?或者閱讀這個大型數據集的其他選擇?我的最終目標是將各個「列」存儲到熊貓數據框中。

+0

是什麼'ARR = chunk_file [ 「ex_dat」] [:,0]'怎麼辦?我期望它讀取0列。它會比讀chunk_file [「ex_dat」] [0,:]'慢,但應該仍然合理。 – hpaulj

+0

你想要一個帶有384列和50行的Dataframe嗎?你會剛剛讀完整件事情。 – hpaulj

回答

0

所以chunk_file['ex_dat']numpy形狀陣列(50000000, 384)。用一個整數爲它索引會自動抓取一行,這是預期的行爲。搶列而不是行中的numpy陣列,只是指數像

chunk_file['ex_dat'][:,0]

其中:是「所有行」和0是第一列。這是同樣的事情作爲轉置矩陣(array.Tnumpy),然後取第一行

chunk_file['ex_dat'].T[0]

+0

對,這也佔用了一堆我的CPU - 大概是因爲它仍在讀取每一行,而我需要的是列信息。除非我解釋這個錯誤,並且它實際上只是在每一行中尋找第0個索引的計算密集型行爲? – Pierpressure

+0

@Pierpressure,數據按「C」順序排列在文件上。所以是的,加載'[:,0]'意味着每次讀取都會跳過384個元素。但是,考慮到數據的存儲方式,沒有辦法。如果顧名思義,數據是「分塊」的,那麼你可以讀取行的子集來節省內存。檢查'h5py'文檔。 – hpaulj

相關問題