Puede usar el producto matriz de puntos para lograr esa puesta a cero. Dado que la matriz que usaremos es muy dispersa (diagonal con ceros para las filas/columnas a las cuales debemos poner a cero), la multiplicación debería ser eficiente.
Usted necesitará una de las siguientes funciones: ejemplo
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)
Uso:
>>> 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.]])
Bueno, acabo intentaron una '[A .__ SetItem __ ((i, j), 0) para i en índices para j en rango (A.shape [1])] 'y' SciPy' me dijeron que 'SparseEfficiencyWarning: cambiar la estructura de dispersión de una matriz csr_matrix es costoso. lil_matrix es más eficiente. ... –
no tiene idea si scipy tiene algún soporte para él, pero como es una matriz de CSR, esto se puede manejar eficientemente (al menos a mano). Una pregunta es, ¿quieres cambiar el patrón de dispersión, o esos 0 deben ser numéricamente 0? – seberg
No estoy seguro de qué se entiende por patrón de dispersión.Procuro resolver un sistema de ecuaciones usando la función scipy.sparse.linalg.spsolve. Espero que esto establezca la necesidad de cambiar el patrón de dispersión, o la falta de él. –