5

私はmatlabから来て、pythonが初めてです。matlab v7.3 (HDF5) 形式で保存された大きな疎行列があります。これまでに、ファイルをロードする 2 つの方法を見つけまし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 からのコメントに基づいて、次の 2 つの方法で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配列に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)"
于 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

numpyhttp://www.scipy.org/NumPy_for_Matlab_Usersがありませ

于 2011-12-06T16:21:15.090 に答える