将使用-v7.3(HDF5)保存的Matlab稀疏矩阵加载到Python中并对其进行操作

时间:2011-12-06 16:16:26

标签: python matlab sparse-matrix hdf5 sparse-array

我是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的评论,我应该补充一点,我已尝试将h5pyf)加载的结果转换为numpy数组或{{1稀疏数组有以下两种方式:

scipy

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

但这两项操作都非常慢。

这里有什么我想念的吗?

3 个答案:

答案 0 :(得分: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)"

答案 1 :(得分: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

答案 2 :(得分:0)