La función argsort parece estar rota. Mirando el código provisto, el argsort para las filas [0, 1] es correcto pero está mal para las filas [2, 3].
Probé esto en diferentes instalaciones de NumPy y versiones 1.11.0 y 1.12.0
import numpy as np
vec = np.array([
[-1.4, -1.2, 1.3],
[-3.6, 3.9, -3.7],
[-2.3, 1.5, -2. ],
[-2.6, 2.4, -1.6]
])
In [1]: np.argsort(-vec, axis=1)
Out[1]:
array([[2, 1, 0],
[1, 0, 2],
[1, 2, 0],
[1, 2, 0]])
No puedo ver nada malo con el resultado, imprima vec[np.arange(4)[:, np.newaxis], np.argsort(-vec, axis=1)]
y vea que se ve bien.
Este es el segundo resultado de Google para "np argsort incorrecto".
La explicación en la página de documentos no está clara (para mí). Agregaré mi propia explicación aquí con la esperanza de que ayude a alguien:
x = numpy.array([1.48,1.31,0.0,0.8])
print x.argsort()
>[2 3 1 0]
Algunas personas podrían esperar que esto proporcione [3, 2, 0, 1]
, es decir, el elemento 0 en la matriz sin clasificar debe ser el tercer elemento en la matriz ordenada.
Lo que realmente hace es proporcionar índices tales que x[np.argsort(x)]
le dará una lista ordenada, es decir, [0.0, 0.8, 1.31, 1.48]
. Dicho de otra manera, [2 3 1 0]
le dice que el elemento 0 de la matriz ordenada es el segundo elemento de la matriz no ordenada.
Si realmente desea obtener [3, 2, 0, 1]
como resultado, puede hacerlo
np.argsort(np.argsort(x))
>[3 2 0 1]
Alternativamente, si está realmente fuera de lugar como yo y solo quiere, digamos, los índices de los 3 elementos más grandes en x
:
np.argsort(x)[:-4:-1]
>[0, 1, 3]
Si realmente desea obtener [3, 2, 0, 1] como salida, puede hacer
Hacer esto será más rápido:
a = np.empty(len(x), np.intp)
a[np.argsort(x)] = np.arange(len(x))
np.invert_permutation(np.argsort(x))
@rossbar , @bjnath : ¿Quizás valga la pena extraer cosas del comentario anterior de @ghost y ponerlas en los documentos? He agregado algunos enlaces cruzados más para mostrar más ejemplos de confusión.
Comentario más útil
Este es el segundo resultado de Google para "np argsort incorrecto".
La explicación en la página de documentos no está clara (para mí). Agregaré mi propia explicación aquí con la esperanza de que ayude a alguien:
Algunas personas podrían esperar que esto proporcione
[3, 2, 0, 1]
, es decir, el elemento 0 en la matriz sin clasificar debe ser el tercer elemento en la matriz ordenada.Lo que realmente hace es proporcionar índices tales que
x[np.argsort(x)]
le dará una lista ordenada, es decir,[0.0, 0.8, 1.31, 1.48]
. Dicho de otra manera,[2 3 1 0]
le dice que el elemento 0 de la matriz ordenada es el segundo elemento de la matriz no ordenada.Si realmente desea obtener
[3, 2, 0, 1]
como resultado, puede hacerloAlternativamente, si está realmente fuera de lugar como yo y solo quiere, digamos, los índices de los 3 elementos más grandes en
x
: