python - transpuesta - numpy tutorial español pdf
¿Ordena eficientemente una matriz numpy en orden descendente? (4)
Me sorprende que esta pregunta específica no haya sido formulada antes, pero realmente no la encontré en SO ni en la documentación de np.sort
.
Digamos que tengo una matriz numpy aleatoria que contiene 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 es esta última declaración eficiente ? ¿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 ordenación para ordenar las cosas en orden inverso.
Lamentablemente, cuando tienes una matriz compleja, solo np.sort(temp)[::-1]
funciona correctamente. Los otros dos métodos mencionados aquí no son efectivos.
Para matrices cortas, sugiero usar np.argsort()
buscando los índices de la matriz negativamente ordenada, que es ligeramente más rápida que invertir la matriz ordenada:
In [37]: temp = np.random.randint(1,10, 10)
In [38]: %timeit np.sort(temp)[::-1]
100000 loops, best of 3: 4.65 µs per loop
In [39]: %timeit temp[np.argsort(-temp)]
100000 loops, best of 3: 3.91 µs per loop
temp[::-1].sort()
ordena la matriz en su lugar, np.sort(temp)[::-1]
crea una nueva matriz.
In [25]: temp = np.random.randint(1,10, 10)
In [26]: temp
Out[26]: array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4])
In [27]: id(temp)
Out[27]: 139962713524944
In [28]: temp[::-1].sort()
In [29]: temp
Out[29]: array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2])
In [30]: id(temp)
Out[30]: 139962713524944
>>> a=np.array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4])
>>> np.sort(a)
array([2, 2, 4, 4, 4, 4, 5, 6, 7, 8])
>>> -np.sort(-a)
array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2])