È possibile utilizzare il prodotto a matrice di punti per ottenere tale azzeramento. Dato che la matrice che useremo è molto sparsa (diagonale con zeri per le righe/colonne che eliminiamo), la moltiplicazione dovrebbe essere efficiente.
Avrete bisogno di una delle seguenti funzioni: ad esempio
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)
Usage:
>>> 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.]])
Beh, ho appena provato un '[A .__ setitem __ ((i, j), 0) per i in indici per j in range (A.shape [1])] 'e' SciPy' mi hanno detto che 'SparseEfficiencyWarning: cambiare la struttura di sparsity di un csr_matrix è costoso. lil_matrix è più efficiente. ... –
non ha idea se scipy abbia qualche supporto per questo, ma dato che è una matrice CSR, questo può essere gestito in modo efficiente (a mano almeno). Una domanda è, vuoi cambiare il pattern di sparsity, o dovrebbero quegli 0 essere solo numericamente 0? – seberg
Non sono sicuro di cosa si intenda per lo schema di sparsità.Procedo alla risoluzione di un sistema di equazioni utilizzando la funzione scipy.sparse.linalg.spsolve. Spero che questo stabilisca la necessità di cambiare lo schema di sparsità, o la sua mancanza. –