Me sorprende que esta pregunta específica no se haya hecho antes, pero realmente no la encontré en SO ni en la documentación de np.sort
.
Digamos que tengo una matriz numérica aleatoria con números enteros, por ejemplo:
> temp = np.random.randint(1,10, 10)
> temp
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4])
Si lo ordeno, obtengo un orden ascendente por defecto:
> np.sort(temp)
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7])
pero quiero que la solución se ordene en orden descendente .
Ahora, sé que siempre puedo hacer:
reverse_order = np.sort(temp)[::-1]
pero, ¿esta última afirmación es eficaz ? ¿No crea una copia en orden ascendente y luego invierte esta copia para obtener el resultado en orden inverso? Si este es realmente el caso, ¿existe una alternativa eficiente? No parece que np.sort
acepte parámetros para cambiar el signo de las comparaciones en la operación de clasificación para poner las cosas en orden inverso.
temp[::-1].sort()
sabe que tiene que ordenar en orden inverso? La forma en que lo leo es: invierta la matriz original y luego ordénela (en orden ascendente). ¿Por qué invertir la matriz original (que viene en un orden aleatorio) y luego ordenarla en orden ascendente devolvería la matriz en orden inverso?[::-1]
simplemente le dice a numpy que repita la matriz hacia atrás, en lugar de reordenar la matriz. Entonces, cuando ocurre la ordenación en el lugar, en realidad ordena en orden ascendente y mueve los bits, pero deja intacta la parte de iteración hacia atrás.a=np.array((...))
el idiomaa[::-1]
no revierte nada, es solo una nueva vista sobre los mismos datos, más específicamente una vista en espejo. El métodoa[::-1].sort()
opera en la imagen reflejada , lo que implica que cuando sesort
mueve hacia la izquierda un elemento más pequeño en su imagen reflejada, en realidad lo está moviendo hacia la derecha en el bloque de memoria real de laa
matriz. La vista reflejada se ordena en orden ascendente, los datos reales se ordenan en orden descendente. ¡Pruébalo tú mismo en casa, con monedas diferentes y un espejo!np.sort(temp,order='descending')
lugar de requerir este tipo de trucosfuente
axis
a quénp.sort
se aplica.np.sort(temp)[::-1]
que colocanan
s en la parte posterior de la matriz en lugar de en el frente. Si eso es bueno o malo está en debate ..Para arreglos cortos, sugiero usarlo
np.argsort()
buscando los índices del arreglo negativo ordenado, que es un poco más rápido que invertir el arreglo ordenado:fuente
a[np.argsort(-a)]
es probablemente el mejor enfoque para cualquier otro en esta página. No hay retroceso de -1 paso y un signo menos menos en el que pensar.Desafortunadamente, cuando tiene una matriz compleja, solo
np.sort(temp)[::-1]
funciona correctamente. Los otros dos métodos mencionados aquí no son efectivos.fuente
Tenga cuidado con las dimensiones.
Dejar
Totalmente inverso
flip
cambiado en1.15
, se requieren versiones anteriores . Solución: .1.14
axis
pip install --upgrade numpy
Primera dimensión invertida
Segunda dimensión invertida
Pruebas
Prueba en una matriz de 100 × 10 × 10 1000 veces.
Esto se debe principalmente a la reindexación más que a
argsort
.fuente
Hola, estaba buscando una solución para revertir la clasificación de una matriz numérica bidimensional, y no pude encontrar nada que funcionara, pero creo que me encontré con una solución que estoy cargando en caso de que alguien esté en el mismo barco.
np.sort ordena en forma ascendente que no es lo que desea, pero el comando fliplr cambia las filas de izquierda a derecha. ¡Parece funcionar!
¡Espero que te ayude!
Supongo que es similar a la sugerencia sobre -np.sort (-a) anterior, pero me desanimé al comentar que no siempre funciona. Quizás mi solución no siempre funcione, sin embargo, la he probado con algunas matrices y parece estar bien.
fuente
Primero puede ordenar la matriz (ascendente de forma predeterminada) y luego aplicar np.flip () ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html )
FYI También funciona con objetos de fecha y hora.
Ejemplo:
fuente
x = np.array([2,3,np.nan,1,0])
elnp.flip(np.sort(x))
enfoque produce [nan 3. 2. 1. 0.], mientras que el-np.sort(-x)
enfoque produce [3. 2. 1. 0. nan].Aquí hay un truco rápido
fuente
sugiero usar esto ...
por ejemplo:
Entonces tu resultado:
fuente
np.arange(20-0.5, 10-0.5, -0.5)
. Pero esa es una historia diferente y puede ser, debido a la peor legibilidad, discutible. Una matriz de entrada no está ordenada en absoluto