5

我是python新手,来自matlab。我有一个以 matlab v7.3 (HDF5) 格式保存的大型稀疏矩阵。到目前为止,我已经找到了两种加载文件的方法,使用h5pytables. 然而,在矩阵上操作似乎都非常慢。例如,在 matlab 中:

>> 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 的评论,我应该补充一点,我已经尝试通过以下两种方式将h5py( f) 加载的结果转换为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))

但是这两个操作也都非常慢。

我在这里缺少什么吗?

4

3 回答 3

3

您的大多数问题是您在sum有效的内存映射数组上使用python(即它在磁盘上,而不是在内存中)。

首先,您正在比较从磁盘读取内容所需的时间与从内存中读取内容所需的时间。如果您想与您在 matlab 中所做的比较,请先将数组加载到内存中。

其次,python 的内置sum函数对于 numpy 数组非常低效。(或者,更确切地说,独立地遍历 numpy 数组的每一项非常慢,这就是 python 的内置sum函数正在做的事情。)使用numpy.sum(yourarray)oryourarray.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)"
于 2011-12-15T18:01:24.307 回答
2

后人的最终答案:

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
于 2011-12-15T17:50:19.460 回答
0

你缺少 numpy http://www.scipy.org/NumPy_for_Matlab_Users

于 2011-12-06T16:21:15.090 回答