4

scipy.sparse.dok_matrix(dimensions mxn)があり、長さmのフラットなnumpy-arrayを追加したいと考えています。

for col in xrange(n):
    dense_array = ...
    dok_matrix[:,col] = dense_array

dok_matrix.__setitem__ただし、このコードは、存在しないキー()を削除しようとすると例外を発生させdel self[(i,j)]ます。

だから、今のところ私はこれを不法な方法でやっています:

for col in xrange(n):
    dense_array = ...
    for row in dense_array.nonzero():
        dok_matrix[row, col] = dense_array[row]

これは非常に非効率的だと感じます。それで、これを行う最も効率的な方法は何ですか?

ありがとう!

4

2 に答える 2

2

あなたの不法な方法がスライス方法と同じ問題を抱えていないことに私は驚いています。これは、Scipyコードを見るとバグのように見えます。dok_matrixの特定の行と列がすでにゼロになっているときにゼロに設定しようとすると、その行と列の値が存在するかどうかを確認せずに削除しようとするため、エラーが発生します。

あなたの質問に答えて、あなたがエレガントでない方法でしていることは、__setitem__メソッドが現在あなたのエレガントなメソッドで行っていることとまったく同じです(いくつかのインスタンスチェックの後とそうでないもの)。エレガントな方法を使用したい場合は、dok.pyを開いてLib/site-packages/scipy/sparse/222行目をから変更することで、独自のScipyパッケージで言及したバグを修正できます。

if value==0:

if value==0 and self.has_key((i,j)):

次に、エレガントな方法を使用でき、それは問題なく機能するはずです。バグ修正を提出しましたが、これは次のバージョンですでに修正されており、これが修正された方法です。

于 2010-04-20T14:55:35.880 に答える
1

このバグはScipy0.8.0で修正されたと思います

于 2010-09-04T15:58:35.267 に答える