Sie können Matrix-Punkt-Produkt verwenden, um diese Nullsetzung zu erreichen. Da die Matrix, die wir verwenden, sehr spärlich ist (Diagonale mit Nullen für die Zeilen/Spalten, die wir auf Null setzen), sollte die Multiplikation effizient sein.
Sie eine der folgenden Funktionen benötigen:
import scipy.sparse
def zero_rows(M, rows):
diag = scipy.sparse.eye(M.shape[0]).tolil()
for r in rows:
diag[r, r] = 0
return diag.dot(M)
def zero_columns(M, columns):
diag = scipy.sparse.eye(M.shape[1]).tolil()
for c in columns:
diag[c, c] = 0
return M.dot(diag)
Anwendungsbeispiel:
>>> A = scipy.sparse.csr_matrix([[1,0,3,4], [5,6,0,8], [9,10,11,0]])
>>> A
<3x4 sparse matrix of type '<class 'numpy.int64'>'
with 9 stored elements in Compressed Sparse Row format>
>>> A.toarray()
array([[ 1, 0, 3, 4],
[ 5, 6, 0, 8],
[ 9, 10, 11, 0]], dtype=int64)
>>> B = zero_rows(A, [1])
>>> B
<3x4 sparse matrix of type '<class 'numpy.float64'>'
with 6 stored elements in Compressed Sparse Row format>
>>> B.toarray()
array([[ 1., 0., 3., 4.],
[ 0., 0., 0., 0.],
[ 9., 10., 11., 0.]])
>>> C = zero_columns(A, [1, 3])
>>> C
<3x4 sparse matrix of type '<class 'numpy.float64'>'
with 5 stored elements in Compressed Sparse Row format>
>>> C.toarray()
array([[ 1., 0., 3., 0.],
[ 5., 0., 0., 0.],
[ 9., 0., 11., 0.]])
Nun, ich habe gerade versucht, ein '[A .__ SetItem __ ((i, j), 0) für i in Indizes für j im Bereich (A.shape [1])] 'und' SciPy' haben mir gesagt, dass 'SparseEfficiencyWarning: die Änderung der Sparsity-Struktur einer csr_matrix teuer ist. lil_matrix ist effizienter.' ... –
keine Ahnung, ob scipy eine Unterstützung dafür hat, aber da es sich um eine CSR-Matrix handelt, kann dies effizient gehandhabt werden (zumindest von Hand). Eine Frage ist, möchten Sie das Sparsity-Muster ändern, oder sollten diese 0 nur numerisch 0 sein? – seberg
Ich bin nicht sicher, was mit dem Sparsity-Muster gemeint ist.Ich fahre fort, ein System von Gleichungen zu lösen, indem ich die scipy.sparse.linalg.spsolve Funktion verwende. Ich hoffe, dass dies die Notwendigkeit feststellt, das Sparsity-Muster oder das Fehlen davon zu ändern. –