2017-08-01 4 views
0

I eine Matrix A in coo Format haben (die von scipy.sparse.bmat erstellt wird):sparsity Struktur für eine einzelne Operation Ändern

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

I würden alle Werte in einer bestimmten Zeile

  1. ändern mögen von dieser Matrix
  2. Lösen Sie spsolve(A, g) für einige g auf der geänderten Matrix

Jetzt kann ich Zeilen im coo Format nicht ändern. Die folgenden Werke:

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

aber ich werde eine

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

Jetzt erhalten, soweit ich das verstehe, ist lil_matrix ineffizient in der linearen Algebra zu lösen - so auch wenn ich die sparsity Struktur lil verändert hatte Ich hätte/hätte danach wieder zu csr oder csc wechseln sollen.

Im Allgemeinen, ist es das wert? Ich möchte nicht jede einzelne Operation, die ich hier mache, schnell testen: Gibt es eine Daumenregel, wie kostspielig "sich verändernde Sparsität" im Vergleich zu "Zeilentrennung" im Vergleich zu "arithmetischen Operationen" ist? Wie gehen Programmierer typischerweise mit solchen Problemen um?

+0

Sie können Ihre eigenen Timings immer tun. Meiner Erfahrung nach ist die 'Effizienzwarnung' hauptsächlich dazu da, Sie davon abzuhalten, dies in einer Schleife zu tun. Eine Änderung wie diese ignoriert sie einmal. Umstellung auf "lil" ist es nicht wert. – hpaulj

Antwort

1

Trotz der Warnung, eine einmalige Änderung csr ist besser als die Rundreise durch 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) 
Verwandte Themen