2011-12-09 12 views
2

私はもともと関連する質問hereを尋ねましたが、実際にはどこにも出てこないようです。私はそれが....Python Pytablesを使ってMatlabの疎行列をロードする

を助けるかもしれない、より具体的にその一部を修正してください場合はおそらく、私は、格納されたファイルは、MATLABのスパース形式(HDF5、私は信じて CSC)を使用して、と私は直接に動作するようPytablesを使用しようとしている必要があり、 ですが、まだ成功していません。私は次の操作を行うことができますh5py使用:

# Method 1: uses h5py (WORKS) 
f1 = h5py.File(fname) 
data = f1['M']['data'] 
ir = f1['M']['ir'] 
jc = f1['M']['jc'] 
M = scipy.sparse.csc_matrix((data, ir, jc)) 

が、私はPytablesに相当するものをやろうとします

# Method 2: uses pyTables (DOESN'T WORK) 
f2 = tables.openFile(fname) 
data = f2.root.M.data 
ir = f2.root.M.ir 
jc = f2.root.M.jc 
M = scipy.sparse.csc_matrix((data,ir,jc)) 

これはエラーで(長い待ち時間の後に)失敗:

TypeError         Traceback (most recent call last) 

/home/tdiethe/BMJ/<ipython console> in <module>() 

/usr/lib/python2.6/dist-packages/scipy/sparse/compressed.pyc in __init__(self, arg1, shape, dtype, copy, dims, nzmax) 
    56      self.indices = np.array(indices, copy=copy) 
    57      self.indptr = np.array(indptr, copy=copy) 
---> 58      self.data = np.array(data, copy=copy, dtype=getdtype(dtype, data)) 
    59     else: 
    60      raise ValueError, "unrecognized %s_matrix constructor usage" %\ 

/usr/lib/python2.6/dist-packages/scipy/sparse/sputils.pyc in getdtype(dtype, a, default) 
    69     canCast = False 
    70    else: 
---> 71     raise TypeError, "could not interpret data type" 
    72  else: 
    73   newdtype = np.dtype(dtype) 

TypeError: could not interpret data type 
f2を見て

In [63]: f2.root.M.data 
Out[63]: 
/M/data (CArray(4753606,), zlib(3)) '' 
    atom := Float64Atom(shape=(), dflt=0.0) 
    maindim := 0 
    flavor := 'numpy' 
    byteorder := 'little' 
    chunkshape := (8181,) 

In [64]: f2.root.M.ir 
Out[64]: 
/M/ir (CArray(4753606,), zlib(3)) '' 
    atom := UInt64Atom(shape=(), dflt=0) 
    maindim := 0 
    flavor := 'numpy' 
    byteorder := 'little' 
    chunkshape := (8181,) 

In [65]: f2.root.M.jc 
Out[65]: 
/M/jc (CArray(133339,), zlib(3)) '' 
    atom := UInt64Atom(shape=(), dflt=0) 
    maindim := 0 
    flavor := 'numpy' 
    byteorder := 'little' 
    chunkshape := (7843,) 

私は2つの質問があります:私はそれに対して操作を実行できるようにするためにscipyのダウンロードスパース行列への変換を実行する必要がある、または私ができるかどのように私はpytables

  • を使用してこのファイルをロードしない

    • をディスクファイル(行列の乗算など)で直接操作を実行します。つまり、ファイルをメモリにロードせずに(pytablesを使用する点は何ですか?)
  • +0

    これらのエラーは、scipyのダウンロードから出てきています。 'data'、' ir'、 'jc'で動作するnumpyだけの能力を調べることができますか?データ(つまり、dtype、形状など)についてnumpyは何を言いますか?結果は期待通りですか? '' scipy.sparse.csc_matrix''の呼び出しシグネチャに期待されるものに対応していますか? – dtlussier

    +0

    ああ、私がやらなければならなかったのは次のようなものでした: 'M = sparse.csc_matrix((f2.root.M.data [...]、f2.root.M.ir [...]、f2) root.M.jc [...])) ' まだ2番目の質問は不明ですか? PyTablesでは、要素単位の操作しか利用できないようですね。 – tdc

    答えて

    3

    私は元の記事でこれを見落としていましたが、あなたの問題は基礎となるデータの上に抽象レベルを追加するPyTablesの設計にあると思います。

    は、次の点に注意してください。この時点data

    >>> import tables 
    >>> import numpy as np 
    
    >>> h5_file = tables.openFile(fname) 
    >>> data = f2.root.M.data 
    

    numpy配列ではありません。

    >>> type(data) 
    tables.array.Array 
    
    >>> isinstance(data, np.ndarray) 
    False 
    

    tables.array.Arrayはすぐに根本的な配列を読み込む、またはすぐに、アレイのような機能を公開しません。これは、scipyで疎な配列を作成するために、これらのタイプのオブジェクトを使用しようとしたときにエラーを引き起こしたものです。

    は、代わりにPyTablesによって生成dataオブジェクトは(すなわち、あなたは空想のインデックス[...]を使用していることをしました)追加のコマンドを介してデータへのアクセスを提供することを意図しています。この方法では、data[:]またはdata.read()を実行して、データの一部またはすべてにアクセスできます。この時点で、使い慣れたnumpyアレイが製造されるだけである。 tables.array.Arrayクラスの詳細については

    http://pytables.github.com/usersguide/libref.html#the-array-classまたは基礎となるデータにアクセスする例についてhttp://www.pytables.org/moin/HowToUseGetting actual dataセクションを参照してください。

    pyh5はアレイのようなオブジェクトを生成しますが、まだnumpyアレイはありません。考えてみましょう:あなたはscipyに呼び出し、またはnp.cos(data)またはdata + np.arange(len(data))ような、より簡単な操作のような

    >>> import pyh5 
    >>> f1 = h5py.File(fname) 
    >>> data = f1['M']['data'] 
    >>> type(data) 
    h5py._hl.dataset.Dataset 
    >>> isinstance(data, np.ndarray) 
    >>> False 
    

    をしかし、あなたはすぐにdatanumpy操作を行うことができます。また、dataオブジェクトには、よく似た属性(shape)があり、基礎データ(numpy.ndarray)はdata.valueに格納されているようです。しかし、私は自分で使っていないので、pyh5に慣れていないので、この点に関して何が制限されているのか分かりません。

    一般に、PyTablespyh5は異なる設計目標を持っているため、異なる方法で使用する必要があります。 pyh5は、HDFファイルに対してよりナンシーなインターフェイスを提供しますが、PyTablesは、操作のようなより複雑なデータベースを提供します。 pyh5PyTablesドキュメントとEnthoughtメーリングリストでの違いの説明を参照してください:

    +0

    非常に有用な回答ありがとうございます。ゆっくりとこれをつかむ! PyTablesは、スケーラビリティが重要なので、私たちのプロジェクトにいくつかの便利な機能を提供すると思います。 – tdc

    +0

    素晴らしい - 喜んで助けてください。 – dtlussier

    関連する問題