Saltar al contenido

Manera eficiente de tomar los valores e índices mínimos/máximos de n de una matriz usando NumPy

Posterior a indagar en diversos repositorios y sitios al final nos hemos encontrado la solución que te mostramos pronto.

Solución:

Desde el momento de la otra respuesta, NumPy ha agregado el numpy.partition y numpy.argpartition funciones para la clasificación parcial, lo que le permite hacer esto en O(arr.size) tiempo, o O(arr.size+n*log(n)) si necesita los elementos en orden ordenado.

numpy.partition(arr, n) devuelve un array la talla de arr donde el nEl elemento es lo que sería si el array fueron ordenados. Todos los elementos menores vienen antes que ese elemento y todos los elementos mayores vienen después.

numpy.argpartition Es para numpy.partition como numpy.argsort Es para numpy.sort.

Así es como usaría estas funciones para encontrar los índices del mínimo n elementos de dos dimensiones arr:

flat_indices = numpy.argpartition(arr.ravel(), n-1)[:n]
row_indices, col_indices = numpy.unravel_index(flat_indices, arr.shape)

Y si necesita los índices en orden, entonces row_indices[0] es la fila del elemento mínimo en lugar de solo uno de los n elementos mínimos:

min_elements = arr[row_indices, col_indices]
min_elements_order = numpy.argsort(min_elements)
row_indices, col_indices = row_indices[min_elements_order], col_indices[min_elements_order]

El caso 1D es mucho más simple:

# Unordered:
indices = numpy.argpartition(arr, n-1)[:n]

# Extra code if you need the indices in order:
min_elements = arr[indices]
min_elements_order = numpy.argsort(min_elements)
ordered_indices = indices[min_elements_order]

Dado que no hay una implementación de montón en NumPy, probablemente su mejor suposición sea ordenar todo array y toma el ultimo n elementos:

def n_max(arr, n):
    indices = arr.ravel().argsort()[-n:]
    indices = (numpy.unravel_index(i, arr.shape) for i in indices)
    return [(arr[i], i) for i in indices]

(Esto probablemente devolverá la lista en orden inverso en comparación con su implementación; no lo verifiqué).

En esta respuesta se proporciona una solución más eficiente que funciona con versiones más nuevas de NumPy.

Reseñas y calificaciones

Si eres capaz, eres capaz de dejar una noticia acerca de qué te ha gustado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada.