Numpy: argsort da resultados incorrectos

Creado en 8 mar. 2017  ·  4Comentarios  ·  Fuente: numpy/numpy

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

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:

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]

Todos 4 comentarios

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

9880 sugiere agregar esto a numpy como 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.

¿Fue útil esta página
0 / 5 - 0 calificaciones