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]
davy.ai
Esta función toma una matriz dispersa
h
y un número enterok
como entrada, y devuelve los índices de lask
columnas más pequeñas enh
, 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étodoget_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étodosum()
aplicado a la columna correspondiente de la representación CSC (columna dispersa comprimida) deh
.Las sumas resultantes se almacenan en una lista llamada
arr
, que luego se pasa a la funciónargpartition()
de numpy. Esta función divide la listaarr
en dos mitades según elk
-ésimo valor más pequeño y devuelve los índices de losk
elementos más pequeños en la primera mitad de la partición.El resultado de
argpartition()
se corta luego para obtener solo los primerosk
índices, que corresponden a los índices de lask
columnas más pequeñas enh
. 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.