2016-04-12 8 views
0

私は現在、各行で列挙している各列の情報に基づいて計算を実行するスパース行列を使用しています。各行は他の列とは完全に独立しています。しかし、大規模な行列の場合、このコードは非常に遅く(約2時間かかる)、行列を高密度に変換することはできません(8GB RAMに制限されています)。Scipyスパース行列の最適化

import scipy.sparse 
import numpy as np 

def process_row(a, b): 
    """ 
    a - contains the row indices for a sparse matrix 
    b - contains the column indices for a sparse matrix 

    Returns a new vector of length(a) 
    """ 

    return 

def assess(mat): 
    """ 
    """ 
    mat_csr = mat.tocsr() 
    nrows, ncols = mat_csr.shape 
    a = np.arange(ncols, dtype=np.int32) 
    b = np.empty(ncols, dtype=np.int32) 
    result = [] 

    for i, row in enumerate(mat_csr): 
     # Process one row at a time 
     b.fill(i) 
     result.append(process_row(b, a)) 

    return result 

if __name__ == '__main__': 
    row = np.array([8,2,7,4]) 
    col = np.array([1,3,2,1]) 
    data = np.array([1,1,1,1]) 

    mat = scipy.sparse.coo_matrix((data, (row, col))) 
    print assess(mat) 

私は、これをはるかに高速に実行できるように設計する方法があるかどうかを検討しています。本質的には、process_row関数は(a、bから)インデックスのペア(行、col)を取り、別のスパース行列を使用して数式を実行し、結果を返します。この関数を変更するオプションはありませんが、実際には異なる行/列のペアを処理でき、同じ行のすべてを処理することに限定されません。

答えて

0

あなたの問題は、この他、最近のSOの質問に似ています:

Calculate the euclidean distance in scipy csr matrix

が私の答えでは、私は、スパース行列の行を反復処理する方法をスケッチ。配列をlilに変換し、そのサブリストから密な行を直接作成するほうが速いと思います。これにより、各行に対して新しいスパース行列を作成するオーバーヘッドが回避されます。しかし、私は時間のテストをしていない。

https://stackoverflow.com/a/36559702/901925

多分これはあなたのケースに適用されます。

関連する問題