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.

¿Cómo puedo asignar un valor a un espacio vacío en una matriz dispersa de tipo scipy csr?

Estoy trabajando con una matriz enorme de tipo csr utilizando SciPy. Esparcida, y quiero agregar un valor a un lugar vacío que nunca se utilizó ni asignó cuando se creó la matriz, sin convertirla en una matriz densa. Tengo los valores deseados de fila, columna y datos, pero no sé cómo acceder a ese elemento específico y agregarle el valor.

Actualización:
Intenté este método pero obtengo un extraño “error de núcleo” y no funciona, asumir: (estamos en la fila k)

data(de la fila k) = np.insert(data, index, 5)
col(indice de la fila) = np.insert(col, index, colIndex)
fila[k+1:] += 1

No puedo entender qué hice mal.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para actualizar un espacio vacío en una matriz dispersa de tipo csr utilizando SciPy, se pueden seguir los siguientes pasos:

    1. Obtener los índices de la fila que se desea actualizar. Por ejemplo, si se desea actualizar el elemento en la fila i y columna j, se puede utilizar los atributos indptr e indices de la matriz csr para obtener la posición de inicio y fin de la fila i en los arrays de datos y columnas.
      inicio_fila = matriz.indptr[i]
      fin_fila = matriz.indptr[i+1]
      indices_fila = matriz.indices[inicio_fila:fin_fila]
      
    2. Verificar si la columna j ya está presente en la fila. Si está presente, entonces actualizar el elemento correspondiente en el array de datos. Si no está presente, insertar un nuevo elemento en la posición adecuada en los arrays de datos y columnas.
      if j in indices_fila:
         # actualizar elemento existente
         k = indices_fila.tolist().index(j)
         matriz.data[inicio_fila+k] += valor
      else:
         # insertar nuevo elemento
         k = bisect_left(indices_fila, j)
         matriz.data = np.insert(matriz.data, inicio_fila+k, valor)
         matriz.indices = np.insert(matriz.indices, inicio_fila+k, j)
         matriz.indptr[i+1:] += 1
      
    3. Finalmente, actualizar el atributo indptr para reflejar el nuevo número de elementos no nulos en la fila después de la inserción.
      matriz.indptr[i+1] += 1
      

    Se debe tener en cuenta que este enfoque asume que la matriz está ordenada por índices de filas y columnas, y que los arrays indptr e indices están en el formato correcto. Si se obtiene un error de kernel al ejecutar el código, puede deberse a un problema de memoria o una sintaxis incorrecta. Asegúrese de verificar el código en busca de errores de sintaxis o importaciones faltantes.

Comments are closed.