2017-08-01 13 views
0

Iは(scipy.sparse.bmatから作成される)coo形式の行列A有する:単一の操作のためにスパース構造を変更

A 
<80000x80000 sparse matrix of type '<class 'numpy.float64'>' 
    with 278480 stored elements in COOrdinate format> 

を私は

  1. 変更特定の行のすべての値を希望この行列の
  2. spsolve(A, g)一部についてはg変更された行列上

今、coo形式の行を変更することはできません。以下の作品:

AA = A.tocsr() 
AA[10, :] = 1 # or whatever other array I want to put here 
spsolve(AA, g) 

が、私は今、私の知る限り理解し、lil_matrix

SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. 
    SparseEfficiencyWarning) 

を取得するには、線形代数を解決するのには非効率的である - 私はlilにスパース構造を変更した場合でも、そうその後、csrまたはcscに変更されているはずです。

一般的に、その価値はありますか?私はここで作っているすべての操作をスピードアップしたくありません:「行間スライス」対「算術演算」のコストがどれほど高価であるかの大まかなルールはありますか?プログラマはどのようにしてこの種の問題に対処しますか?

+0

あなたは常にあなた自身のタイミングを行うことができます。私の経験では、「効率的な警告」は主にあなたがループでこれをやめないようにするためのものです。このような1回の変更に対しては無視してください。 'lil'への変換はそれに値するものではありません。 – hpaulj

答えて

1

警告にもかかわらず、csrに1時間の変更がlilて往復よりも優れている:

In [137]: %%timeit M = sparse.random(10,10,.2,format='csr') 
    ...: M[-1,:] = np.arange(10) 
    ...: 
    SparseEfficiencyWarning) 
204 µs ± 5.06 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [139]: %%timeit M = sparse.random(10,10,.2,format='csr') 
    ...: M1=M.tolil(); M1[-1,:] = np.arange(10); M = M1.tocsr() 
444 µs ± 9.91 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 

In [141]: %%timeit M = sparse.random(10,10,.2,format='lil') 
    ...: M[-1,:] = np.arange(10) 
162 µs ± 84.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
関連する問題