Dans numpy
/ scipy
, existe-t-il un moyen efficace d'obtenir des nombres de fréquences pour des valeurs uniques dans un tableau?
Quelque chose dans ce sens:
x = array( [1,1,1,2,2,2,5,25,1,1] )
y = freq_count( x )
print y
>> [[1, 5], [2,3], [5,1], [25,1]]
(Pour vous, utilisateurs R, je recherche essentiellement la table()
fonction)
collections.Counter(x)
suffisant?Réponses:
Jetez un œil à
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
Puis:
ou:
ou comme vous voulez combiner les nombres et les valeurs uniques.
la source
Depuis Numpy 1.9, la méthode la plus simple et la plus rapide consiste à simplement utiliser
numpy.unique
, qui a maintenant unreturn_counts
argument mot - clé:Qui donne:
Une comparaison rapide avec
scipy.stats.itemfreq
:la source
return_counts
argument mot - clé n'existait pas, ce qui pourrait expliquer l'exception. Dans ce cas, les documents suggèrent quenp.unique(x, True)
c'est équivalent ànp.unique(x, return_index=True)
, ce qui ne renvoie pas de décompte.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Lorsque cette fonctionnalité a été ajoutée (voir ici ), certains tests informels ontreturn_counts
permis de cadencer 5 fois plus rapidement.Mise à jour: La méthode mentionnée dans la réponse d'origine est déconseillée, nous devrions utiliser la nouvelle méthode à la place:
Réponse originale:
vous pouvez utiliser scipy.stats.itemfreq
la source
J'étais également intéressé par cela, j'ai donc fait une petite comparaison des performances (en utilisant perfplot , un de mes projets favoris ). Résultat:
est de loin le plus rapide. (Notez l'échelle du journal.)
Code pour générer le tracé:
la source
equality_check=array_sorteq
dansperfplot.show()
. Ce qui provoquait une erreur (en Python 2) étaitpd.value_counts
(même avec sort = False).Utilisation du module pandas:
la source
C'est de loin la solution la plus générale et la plus performante; surpris qu'il n'ait pas encore été publié.
Contrairement à la réponse actuellement acceptée, elle fonctionne sur tout type de données triable (pas seulement les entiers positifs) et ses performances sont optimales; la seule dépense importante concerne le tri effectué par np.unique.
la source
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
est probablement le meilleur choix. Si votre tableau contient autre chose que de petits nombres entiers denses, il pourrait être utile de l'envelopper quelque chose comme ceci:Par exemple:
la source
Même s'il a déjà été répondu, je suggère une approche différente qui utilise
numpy.histogram
. Cette fonction étant donnée une séquence, elle renvoie la fréquence de ses éléments regroupés dans des bacs .Attention cependant : cela fonctionne dans cet exemple car les nombres sont des entiers. S'ils étaient en nombres réels, cette solution ne s'appliquerait pas aussi bien.
la source
Cela vous donne: {1: 5, 2: 3, 5: 1, 25: 1}
la source
collections.Counter(x)
donnent également le même résultat. Je crois que l'OP veut une sortie qui ressemble à latable
fonction R. Garder leSeries
peut être plus utile.pd.Series(x).reshape(-1)
s'il s'agit d'un tableau multidimensionnel.Pour compter des non-entiers uniques - similaires à la réponse d'Eelco Hoogendoorn mais considérablement plus rapides (facteur 5 sur ma machine), j'ai l'habitude
weave.inline
de combinernumpy.unique
avec un peu de code c;Informations sur le profil
La
numpy
version pure d'Eelco :Remarque
Il y a redondance ici (
unique
effectue également un tri), ce qui signifie que le code pourrait probablement être encore optimisé en plaçant launique
fonctionnalité à l'intérieur de la boucle de code C.la source
Vieille question, mais je voudrais fournir ma propre solution qui s'avère être la plus rapide, utiliser la normale
list
au lieu denp.array
la saisir (ou la transférer dans la liste en premier), sur la base de mon test au banc.Vérifiez-le si vous le rencontrez également.
Par exemple,
100000 boucles, le meilleur de 3: 2,26 µs par boucle
100000 boucles, le meilleur de 3: 8,8 µs par boucle
100000 boucles, meilleur de 3: 5,85 µs par boucle
Alors que la réponse acceptée serait plus lente, et la
scipy.stats.itemfreq
solution est encore pire.Un test plus approfondi n'a pas confirmé l'attente formulée.
Réf. commentaires ci-dessous sur le cache et autres effets secondaires en RAM qui influencent les résultats d'un test massivement répétitif d'un petit ensemble de données.
la source
numpy
n'est pas nécessairement la voie à suivre.quelque chose comme ça devrait le faire:
En outre, ce post précédent sur le comptage efficace des éléments uniques semble assez similaire à votre question, sauf si je manque quelque chose.
la source
comptage de fréquences multidimensionnelles, c. à d. tableaux de comptage.
la source
la source
la source