Ich muss ein Array filtern, um die Elemente zu entfernen, die unter einem bestimmten Schwellenwert liegen. Mein aktueller Code lautet wie folgt:
threshold = 5
a = numpy.array(range(10)) # testing data
b = numpy.array(filter(lambda x: x >= threshold, a))
Das Problem ist, dass dadurch eine temporäre Liste erstellt wird, die einen Filter mit einer Lambda-Funktion (langsam) verwendet.
Da dies eine recht einfache Operation ist, gibt es möglicherweise eine Numpy-Funktion, die dies auf effiziente Weise ausführt, aber ich konnte sie nicht finden.
Ich habe gedacht, dass ein anderer Weg, dies zu erreichen, darin bestehen könnte, das Array zu sortieren, den Index des Schwellenwerts zu finden und ab diesem Index ein Slice zurückzugeben, aber selbst wenn dies für kleine Eingaben schneller wäre (und es sowieso nicht auffällt ), es ist definitiv asymptotisch weniger effizient, wenn die Eingabegröße zunimmt.
Irgendwelche Ideen? Vielen Dank!
Update : Ich habe auch einige Messungen vorgenommen und das Sortieren + Schneiden war immer noch doppelt so schnell wie der reine Python-Filter, als die Eingabe 100.000.000 Einträge betrug.
In [321]: r = numpy.random.uniform(0, 1, 100000000)
In [322]: %timeit test1(r) # filter
1 loops, best of 3: 21.3 s per loop
In [323]: %timeit test2(r) # sort and slice
1 loops, best of 3: 11.1 s per loop
In [324]: %timeit test3(r) # boolean indexing
1 loops, best of 3: 1.26 s per loop
%timeit
verwendet das integriertetimeit
Modul. Schauen Sie es sich auch an. docs.python.org/library/timeit.htmlAntworten:
b = a[a>threshold]
das sollte reichenIch habe wie folgt getestet:
ich habe
http://docs.scipy.org/doc/numpy/user/basics.indexing.html#boolean-or-mask-index-arrays
quelle
np.ma
dazu gedacht ist, kann ich nicht herausfinden, wie.