Alte Frage, aber ich möchte meine eigene Lösung bereitstellen, die sich als die schnellste herausstellt. Verwenden Sie normal list
anstelle von np.array
als Eingabe (oder zuerst zur Liste übertragen), basierend auf meinem Bench-Test.
Probieren Sie es aus, wenn Sie auch darauf stoßen.
def count(a):
results = {}
for x in a:
if x not in results:
results[x] = 1
else:
results[x] += 1
return results
Beispielsweise,
>>>timeit count([1,1,1,2,2,2,5,25,1,1]) would return:
100000 Schleifen, am besten 3: 2,26 µs pro Schleife
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]))
100000 Schleifen, am besten 3: 8,8 µs pro Schleife
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]).tolist())
100000 Schleifen, am besten 3: 5,85 µs pro Schleife
Während die akzeptierte Antwort langsamer wäre und die scipy.stats.itemfreq
Lösung noch schlechter ist.
Eine eingehendere Prüfung bestätigte die formulierte Erwartung nicht.
from zmq import Stopwatch
aZmqSTOPWATCH = Stopwatch()
aDataSETasARRAY = ( 100 * abs( np.random.randn( 150000 ) ) ).astype( np.int )
aDataSETasLIST = aDataSETasARRAY.tolist()
import numba
@numba.jit
def numba_bincount( anObject ):
np.bincount( anObject )
return
aZmqSTOPWATCH.start();np.bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
14328L
aZmqSTOPWATCH.start();numba_bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
592L
aZmqSTOPWATCH.start();count( aDataSETasLIST );aZmqSTOPWATCH.stop()
148609L
Ref. Kommentare unten zu Cache und anderen In-RAM-Nebenwirkungen, die einen kleinen Datensatz beeinflussen, der sich massiv wiederholt.
collections.Counter(x)
ausreichend