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.

Encontrando eficientemente los índices de las columnas más pequeñas de una matriz dispersa.

Por “columna más pequeña” me refiero a la columna cuya suma de elementos es la menor (es decir, más negativa). Aquí está mi intento pero no es muy eficiente porque construyo una lista completa de las sumas de las columnas. h es una matriz scipy.sparse, k es el número de índices solicitados. No es importante que el resultado esté ordenado.

def indices_of_smallest_columns(h, k):
    size = h.get_shape()[0]
    arr = [h.tocsc().getcol(i).sum() for i in range(size)]
    return np.argpartition(arr, k)[:k]
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Esta función toma una matriz dispersa h y un número entero k como entrada, y devuelve los índices de las k columnas más pequeñas en h, donde “más pequeñas” se refiere a las columnas con la suma más negativa de elementos.

    La función primero recupera la forma de h utilizando el método get_shape(), y extrae el número de filas en la matriz (asumiendo una matriz cuadrada). Luego, itera sobre cada columna de la matriz y calcula la suma de los elementos en esa columna utilizando el método sum() aplicado a la columna correspondiente de la representación CSC (columna dispersa comprimida) de h.

    Las sumas resultantes se almacenan en una lista llamada arr, que luego se pasa a la función argpartition() de numpy. Esta función divide la lista arr en dos mitades según el k-ésimo valor más pequeño y devuelve los índices de los k elementos más pequeños en la primera mitad de la partición.

    El resultado de argpartition() se corta luego para obtener solo los primeros k índices, que corresponden a los índices de las k columnas más pequeñas en h. Estos índices se devuelven como la salida final de la función.

    Si bien esta implementación funciona correctamente, es posible que no sea la forma más eficiente de resolver este problema, ya que construye una lista completa de las sumas de las columnas antes de encontrar los valores más pequeños. Un enfoque más eficiente podría implicar realizar las sumas de columnas y la selección de índices simultáneamente, o utilizar un algoritmo diferente por completo.

Comments are closed.