hay una función integrada de Python que hace en python.array
lo que argsort()
hace en un numpy.array
?Equivalente a Numpy.argsort() en python básico?
Respuesta
Cronometré las sugerencias anteriores y aquí están mis resultados.
En primer lugar, las funciones:
def f(seq):
# http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3383106#3383106
#non-lambda version by Tony Veijalainen
return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
def g(seq):
# http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3383106#3383106
#lambda version by Tony Veijalainen
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
def h(seq):
#http://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python/3382369#3382369
#by unutbu
return sorted(range(len(seq)), key=seq.__getitem__)
Ahora, la sesión IPython:
In [16]: seq = rand(10000).tolist()
In [17]: %timeit f(seq)
100 loops, best of 3: 10.5 ms per loop
In [18]: %timeit g(seq)
100 loops, best of 3: 8.83 ms per loop
In [19]: %timeit h(seq)
100 loops, best of 3: 6.44 ms per loop
Fwiw
No hay una función incorporada, pero es fácil de montar una de las herramientas fenomenales Python tiene disponibles:
def argsort(seq):
# http://stackoverflow.com/questions/3071415/efficient-method-to-calculate-the-rank-vector-of-a-list-in-python
return sorted(range(len(seq)), key=seq.__getitem__)
x = [5,2,1,10]
print(argsort(x))
# [2, 1, 0, 3]
Funciona en Python array.array
s de la misma manera:
import array
x = array.array('d', [5, 2, 1, 10])
print(argsort(x))
# [2, 1, 0, 3]
+1 Muy Pythonic! – katrielalex
En lugar de usar el (teóricamente privado) __getitem__, también puedes usar 'operator.itemgetter' /' operator.attrgetter' http://docs.python.org/library/operator.html – Ender
Si 'operator.itemgetter' podría estar usado como un reemplazo directo para '__getitem__', creo que estuve de acuerdo contigo, Ender, pero por lo que puedo ver,' operator.itemgetter' también necesitaría envolverlo en una expresión 'lambda'. Prefiero evitar el 'lambda' extra si pudiera. – unutbu
alternativo con enumerar:
def argsort(seq):
return [x for x,y in sorted(enumerate(seq), key = lambda x: x[1])]
seq=[5,2,1,10]
print(argsort(seq))
# Output:
# [2, 1, 0, 3]
mejor, aunque el uso de respuesta https://stackoverflow.com/users/9990/marcelo-cantos responder a enhebrar python sort without lambda expressions
[i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
encontrado esta pregunta, pero argsort necesario para una lista de objetos basado en una propiedad del objeto.
La extensión de la respuesta de unutbu, esto sería:
sorted(range(len(seq)), key = lambda x: seq[x].sort_property)
- 1. importaciones básico Python cuestionar
- 2. Python equivalente a find2perl
- 3. Python equivalente a Jstack?
- 4. Python Equivalente a phpinfo()
- 5. Python equivalente a C# .Seleccione?
- 6. Clojure equivalente a Python doctest?
- 7. Python equivalente a C++ getline()
- 8. Python equivalente a atoi/atof
- 9. Rubí equivalente a Python __main__
- 10. Python equivalente a "php -s"
- 11. Equivalente a Maven para python
- 12. equivalente de Java a bisección en python
- 13. Equivalente a Python urllib en Haskell
- 14. Equivalente a __func__ (de C) en Python
- 15. Python, más allá de lo básico
- 16. Crear un iterador básico de Python
- 17. C++ equivalente a los docámenes de Python?
- 18. Ruby equivalente a la ayuda de Python()?
- 19. Scala equivalente a Python devolver varios artículos
- 20. ¿Tiene Python un equivalente a java.lang.Math.nextUp?
- 21. MATLAB equivalente a string.join de Python()
- 22. Python es equivalente a strip_tags de PHP?
- 23. C++ equivalente a la función Python len()?
- 24. Python equivalente a Perl's while (<>) {...}?
- 25. Python Equivalente a #each_cons de Ruby?
- 26. ¿Python tiene un equivalente a 'cambiar'?
- 27. Python equivalente a cada_slice de Ruby (conteo)
- 28. Java Equivalente a los diccionarios de Python
- 29. Python equivalente a la función LINQ All?
- 30. ¿qué es python equivalente a PHP $ _SERVER?
Interesante - probablemente el promedio es más importante que el "mejor" de 3 (?) – JPH
El promedio se ve afectado por valores atípicos. No desea que los resultados sean contaminados por otros programas en ejecución o falta de memoria caché de hardware casualidades. –