array argmin python arrays numpy minimum

array - argmin python



Necesito los N valores mínimos(índice) en una matriz numpy (4)

Desde que se publicó esta pregunta, numpy se ha actualizado para incluir una forma más rápida de seleccionar los elementos más pequeños de una matriz mediante argpartition . Fue incluido por primera vez en Numpy 1.8.

Utilizando la respuesta de snarly como inspiración, podemos encontrar rápidamente los elementos más pequeños de k=3 :

In [1]: import numpy as np In [2]: arr = np.array([1, 3, 2, 4, 5]) In [3]: k = 3 In [4]: ind = np.argpartition(arr, k)[:k] In [5]: ind Out[5]: array([0, 2, 1]) In [6]: arr[ind] Out[6]: array([1, 2, 3])

Esto se ejecutará en tiempo O (n) porque no es necesario realizar una ordenación completa. Si necesita que sus respuestas estén ordenadas ( Nota: en este caso, la matriz de salida estaba ordenada pero eso no está garantizado) puede ordenar la salida:

In [7]: sorted(arr[ind]) Out[7]: array([1, 2, 3])

Esto se ejecuta en O (n + k log k) porque la clasificación se realiza en la lista de salida más pequeña.

Hola, tengo una matriz con X cantidad de valores. Me gustaría ubicar los índices de los diez valores más pequeños. En este enlace calcularon el máximo efectivamente, ¿Cómo obtener índices de N valores máximos en una matriz numpy? sin embargo, todavía no puedo hacer comentarios sobre los enlaces, así que tengo que volver a publicar la pregunta.

No estoy seguro de qué índices necesito cambiar para alcanzar los valores mínimos y no los máximos. Este es su codigo

In [1]: import numpy as np In [2]: arr = np.array([1, 3, 2, 4, 5]) In [3]: arr.argsort()[-3:][::-1] Out[3]: array([4, 3, 1])


No garantizo que esto sea más rápido, pero un mejor algoritmo dependerá de heapq .

import heapq indices = heapq.nsmallest(10,np.nditer(arr),key=arr.__getitem__)

Esto debería funcionar en aproximadamente O(N) operaciones mientras que usar argsort tomaría operaciones O(NlogN) . Sin embargo, el otro se empuja a C altamente optimizado, por lo que aún podría tener un mejor desempeño. Para estar seguro, necesitará realizar algunas pruebas en sus datos reales.


Si llamas

arr.argsort()[:3]

Te dará los índices de los 3 elementos más pequeños.

array([0, 2, 1], dtype=int64)

Entonces, para n , deberías llamar

arr.argsort()[:n]


Simplemente no invierta los resultados de clasificación.

In [164]: a = numpy.random.random(20) In [165]: a Out[165]: array([ 0.63261763, 0.01718228, 0.42679479, 0.04449562, 0.19160089, 0.29653725, 0.93946388, 0.39915215, 0.56751034, 0.33210873, 0.17521395, 0.49573607, 0.84587652, 0.73638224, 0.36303797, 0.2150837 , 0.51665416, 0.47111993, 0.79984964, 0.89231776])

Ordenados

In [166]: a.argsort() Out[166]: array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2, 17, 11, 16, 8, 0, 13, 18, 12, 19, 6])

Diez primeros

In [168]: a.argsort()[:10] Out[168]: array([ 1, 3, 10, 4, 15, 5, 9, 14, 7, 2])