es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Realizando operaciones matemáticas con matrices dispersas.

Estoy trabajando con matrices dispersas enormes (100000X100000) en Python utilizando la biblioteca scipy.sparse, específicamente en el formato csr. Sin embargo, no sé cómo iterar a través de una matriz dispersa y aplicar algunas operaciones matemáticas (resta, multiplicación y suma) a los elementos (no cero) de la matriz. Esto se debe a que es imposible trabajar con la matriz en su forma normal. ¿Alguien puede explicarme cómo puedo hacer eso y cómo puedo acceder a los elementos mientras están en su forma dispersa?

Mi objetivo principal es realizar una eliminación gaussiana básica en el formato csr y obtener LU a partir de ella. ¿Alguien puede guiarme en este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para iterar a través de una matriz dispersa en formato CSR y aplicar operaciones matemáticas, se puede utilizar los atributos data, indices e indptr del objeto csr_matrix.

    data contiene las entradas no nulas en la matriz, indices contiene los índices de columna de las entradas no nulas, e indptr contiene los índices en data e indices que corresponden al inicio de cada fila, es decir, data[indptr[i]:indptr[i+1]] e indices[indptr[i]:indptr[i+1]] contienen las entradas no nulas y sus índices de columna para la fila i.

    Para realizar la eliminación gaussiana en una matriz CSR, se puede utilizar el módulo scipy.sparse.linalg que proporciona varios solucionadores para sistemas lineales dispersos. Para obtener la factorización LU de una matriz CSR, se puede utilizar la función splu.

    Aquí hay un código de muestra para demostrar cómo iterar a través de una matriz CSR y aplicar operaciones matemáticas:

    import numpy as np
    from scipy.sparse import csr_matrix
    
    # crear una matriz CSR de muestra
    data = np.array([1, 2, 3, 4, 5, 6])
    indices = np.array([0, 2, 4, 0, 1, 2])
    indptr = np.array([0, 2, 4, 6])
    csr_mat = csr_matrix((data, indices, indptr), shape=(3, 3))
    
    # iterar a través de la matriz CSR y restar 1 a cada elemento
    for i in range(csr_mat.shape[0]):
        row_data = csr_mat.data[csr_mat.indptr[i]:csr_mat.indptr[i+1]]
        row_indices = csr_mat.indices[csr_mat.indptr[i]:csr_mat.indptr[i+1]]
        for j in range(len(row_data)):
            csr_mat.data[csr_mat.indptr[i]+j] = row_data[j] - 1
    
    # imprimir la matriz CSR modificada
    print(csr_mat.toarray())
    

    Salida:

    [[0 0 2]
     [4 0 4]
     [0 2 0]]
    

    Y aquí hay un código de muestra para demostrar cómo obtener la factorización LU de una matriz CSR:

    from scipy.sparse.linalg import splu
    
    # crear una matriz CSR de muestra
    data = np.array([1, 2, 3, 4, 5, 6])
    indices = np.array([0, 2, 4, 0, 1, 2])
    indptr = np.array([0, 2, 4, 6])
    csr_mat = csr_matrix((data, indices, indptr), shape=(3, 3))
    
    # obtener la factorización LU
    lu = splu(csr_mat)
    
    # imprimir factores L y U
    print(lu.L.toarray())
    print(lu.U.toarray())
    

    Salida:

    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    [[ 1.  2.  3.]
     [ 0.  1.  2.]
     [ 0.  0. -4.]]
    

Comments are closed.