Gibt es eine eingebaute Funktion von Python, die auf python.array
tut, was argsort()
auf einem numpy.array
tut?Entspricht Numpy.argsort() dem grundlegenden Python?
Antwort
ich die oben genannten Vorschläge und meine Ergebnisse hier sind zeitlich fädeln.
Zunächst einmal die Funktionen:
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__)
nun die IPython Sitzung:
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
Es gibt keine integrierte Funktion, aber es ist einfach eine von den tollen Werkzeugen zu montieren Python zur Verfügung stellt:
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]
Es ist auf Python arbeitet array.array
s die gleiche Art und Weise:
import array
x = array.array('d', [5, 2, 1, 10])
print(argsort(x))
# [2, 1, 0, 3]
+1 Sehr Pythonic! – katrielalex
Anstatt das (theoretisch private) __getitem__ zu verwenden, können Sie auch 'operator.itemgetter' /' operator.attrgetter' verwenden. Http://docs.python.org/library/operator.html – Ender
Wenn 'operator.itemgetter' sein könnte als ein Ersatz für "__getitem__" verwendet, glaube ich, dass ich mit dir Ender einverstanden war, aber soweit ich das sehen kann, würde 'operator.itemgetter' auch erfordern, dass es in einen 'Lambda'-Ausdruck eingebunden wird. Ich würde lieber das zusätzliche 'Lambda' vermeiden, wenn ich könnte. – unutbu
Meine Alternative mit enumerate:
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]
Bessere obwohl Antwort zu verwenden, aus https://stackoverflow.com/users/9990/marcelo-cantos beantworten python sort without lambda expressions
[i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
diese Frage gefunden, aber benötigt argsort für eine Liste von Objekten basierend auf eine Objekteigenschaft
Erweiterung unutbu Antwort, dies wäre:
sorted(range(len(seq)), key = lambda x: seq[x].sort_property)
- 1. Python entspricht dem Perl-qw()
- 2. Python entspricht Java's BitSet
- 3. Problem mit dem grundlegenden Server/Client-Code
- 4. Clojure entspricht Python doctest?
- 5. Python-Fehler in der grundlegenden Subtraktion?
- 6. Python entspricht "php -s"
- 7. Python entspricht Sinatra
- 8. Python entspricht atoi/atof
- 9. Python entspricht Java's compareTo()
- 10. Rubin entspricht Python __main__
- 11. JavaBean entspricht in Python
- 12. VisualVM entspricht für Python
- 13. Python entspricht Sed
- 14. Lua entspricht Python dis()?
- 15. Passport.js entspricht für Python?
- 16. Python Extrakt Muster entspricht
- 17. Python: Liste entspricht
- 18. Entspricht getfenv in Python?
- 19. WebRequest Entspricht dem CURL-Befehl
- 20. Typ entspricht nicht dem Protokoll
- 21. Entspricht Drupal dem MVC-Paradigma?
- 22. Paketname entspricht nicht dem Dateipfad
- 23. Python-Subprozess Popen.communicate() entspricht Popen.stdout.read()?
- 24. Python entspricht perl vec() Funktion
- 25. Python entspricht Ruby Array.each-Methode
- 26. Java entspricht Python alle und
- 27. einfachste Python entspricht Rs gsub
- 28. Python-Regex entspricht Unicode-Eigenschaften
- 29. einfachste Python entspricht R's grepl
- 30. Python dir() entspricht in JavaScript?
Interessant - wahrscheinlich ist der Durchschnitt wichtiger als die "Beste" von 3 (?) – JPH
Der Durchschnitt wird durch Ausreißer beeinflusst.Sie wollen nicht, dass die Ergebnisse durch andere laufende Programme oder Hardware-Cache-Misses verschmutzt werden Zufälligkeiten. –