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])