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

ghhkc1vu  于 2022-12-19  发布在  Matlab
关注(0)|答案(3)|浏览(171)

我是来自matlab的python新手。我有一个很大的稀疏矩阵,保存在matlab v7.3(HDF 5)格式中。到目前为止,我已经找到了两种加载文件的方法,使用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

使用h5 py:

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))

但是这两种操作也都非常慢。
我是不是漏掉了什么?

guz6ccqo

guz6ccqo1#

你的大部分问题是你在一个内存Map数组上使用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)"
4c8rllxm

4c8rllxm2#

留给后人的最终答案:

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
lsmd5eda

lsmd5eda3#

你错过了NumPy here是Matlab用户的指南。

相关问题