2011-12-06 49 views
5

我是新來的python,來自matlab。我有一個保存在matlab v7.3(HDF5)格式的大型稀疏矩陣。到目前爲止,我已經在文件中找到了兩種加載方式,分別使用h5pytables。然而,在矩陣運行後,似乎也非常緩慢。例如,在MATLAB:加載matlab稀疏矩陣保存與-v7.3(HDF5)到Python並在其上運行

>> whos  
    Name   Size     Bytes Class  Attributes 

    M  11337x133338   77124408 double sparse  

>> tic, sum(M(:)); toc 
Elapsed time is 0.086233 seconds. 

使用表格:

t = time.time() 
sum(f.root.M.data) 
elapsed = time.time() - t 
print elapsed 
35.929461956 

使用h5py:

t = time.time() 
sum(f["M"]["data"]) 
elapsed = time.time() - t 
print elapsed 

(我放棄了等待......)

[編輯]

根據評論從@bpgergo,我要補充,我試圖通過h5pyf)加載在結果轉換成numpy陣列或scipy稀疏陣列中的以下兩種方式:

from scipy import sparse 
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"])) 

data = numpy.asarray(f["M"]["data"]) 
ir = numpy.asarray(f["M"]["ir"]) 
jc = numpy.asarray(f["M"]["jc"])  
    A = sparse.coo_matrix(data, (ir, jc)) 

但這兩種操作也非常緩慢。

有什麼我在這裏失蹤?

回答

3

您大部分的問題是,你使用python sum什麼有效的內存映射陣列(即它的在磁盤上,不在內存中)。

首先,您將比較從磁盤讀取內容到在內存中讀取內容所需的時間。首先將數組加載到內存中,如果你想比較你在matlab中做什麼。

其次,Python的內置sum是非常不適合numpy數組。 (或者,相反,獨立遍歷numpy數組中的每一項都非常緩慢,這正是python內置的sum正在做的。)使用numpy.sum(yourarray)yourarray.sum()代替numpy數組。

舉個例子:

(使用h5py,因爲我更熟悉它)

import h5py 
import numpy as np 

f = h5py.File('yourfile.hdf', 'r') 
dataset = f['/M/data'] 

# Load the entire array into memory, like you're doing for matlab... 
data = np.empty(dataset.shape, dataset.dtype) 
dataset.read_direct(data) 

print data.sum() #Or alternately, "np.sum(data)" 
+0

在Matlab中加載文件幾乎是瞬時的(<1秒),所以我認爲比較是公平的,但我關於內置求和函數的看法。我認爲越來越多的人會做我正在做的事情(從Matlab轉向Python),所以如果在Matlab文件中加載一點點支持,恕我直言......恕我直言...... – tdc

+1

嗯,我不能在沒有你的文件的情況下測試它,但實際上在python中加載數組的速度也應該很快。你目前所做的並不是實際加載它。它會使有效的內存映射數組重新恢復。任何語言都獨立訪問它會很慢,因爲它主要是磁盤搜索。上面的示例代碼仍然很慢?另外,看看'scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat,雖然我不是確定它是否支持稀疏數組。 –

+0

沒有機會嘗試它,但感謝輸入 – tdc

0
+0

任何更多的線索?如果我做'M = numpy.asarray(f [「M」] [「data」])'這似乎需要永遠...... – tdc

+0

@tdc,我甚至不知道你的代碼裏有什麼'f'。嘗試諮詢此頁面:http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html。雖然我讀過,但你仍然需要一個HDF5 python庫來加載v7.3 Matlab文件。 – bpgergo

+0

也沒有關於稀疏矩陣的內容 – tdc

1

爲後人最終的答案:

import tables, warnings 
from scipy import sparse 

def load_sparse_matrix(fname) : 
    warnings.simplefilter("ignore", UserWarning) 
    f = tables.openFile(fname) 
    M = sparse.csc_matrix((f.root.M.data[...], f.root.M.ir[...], f.root.M.jc[...])) 
    f.close() 
    return M