我是python的新手,来自matlab。我有一个大的稀疏矩阵保存在matlab v7.3 (HDF5)格式。到目前为止,我已经找到了两种加载文件的方法,使用h5py
和tables
。然而,在任何一种情况下,对矩阵的操作似乎都非常缓慢。例如,在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
(I give up wait…)
[编辑]基于@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))
,但是这两个操作都非常慢。
我在这里错过了什么吗?
你的大部分问题是你使用python sum
什么是有效的内存映射数组(即它在磁盘上,而不是在内存中)。
首先,比较从磁盘读取内容所花费的时间和从内存中读取内容所花费的时间。如果您想与matlab中所做的进行比较,请先将数组加载到内存中。
其次,python的内置sum
对于numpy数组是非常低效的。(或者更确切地说,独立地遍历numpy数组的每一项是非常慢的,这就是python内置的sum
所做的。)对于numpy数组,请使用numpy.sum(yourarray)
或yourarray.sum()
。
例如:
(使用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)"
留给子孙的最终答案:
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
你错过了NumPy;下面是Matlab用户指南