288 votes

numpy: le nombre de fréquences unique pour les valeurs dans un tableau

Dans numpy/scipy, est-il un moyen efficace pour obtenir le nombre de fréquences pour des valeurs uniques dans un tableau?

Quelque chose le long de ces lignes:

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 R d'utilisateurs là-bas, je suis fondamentalement à la recherche de la table (), fonction)

597voto

jme Points 694

Comme de Numpy 1.9, le plus simple et le plus rapide de la méthode est d'utiliser simplement numpy.unique, qui a maintenant une (soi-loin-sans-papiers) return_counts argument mot-clé:

import numpy as np

x = np.array([1,1,1,2,2,2,5,25,1,1])
unique, counts = np.unique(x, return_counts=True)

print np.asarray((unique, counts)).T

Ce qui donne:

[[ 1  5]
 [ 2  3]
 [ 5  1]
 [25  1]]

Une comparaison rapide avec scipy.stats.itemfreq:

In [4]: x = np.random.random_integers(0,100,1e6)

In [5]: %timeit unique, counts = np.unique(x, return_counts=True)
10 loops, best of 3: 31.5 ms per loop

In [6]: %timeit scipy.stats.itemfreq(x)
10 loops, best of 3: 170 ms per loop

182voto

JoshAdel Points 15911

Jetez un oeil à l' np.bincount:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html

import numpy as np
x = np.array([1,1,1,2,2,2,5,25,1,1])
y = np.bincount(x)
ii = np.nonzero(y)[0]

Et puis:

zip(ii,y[ii]) 
# [(1, 5), (2, 3), (5, 1), (25, 1)]

ou:

np.vstack((ii,y[ii])).T
# array([[ 1,  5],
         [ 2,  3],
         [ 5,  1],
         [25,  1]])

ou cependant vous souhaitez combiner les comtes et les valeurs uniques.

144voto

MCKelvin Points 693

vous pouvez utiliser scipy.les stats.itemfreq

>>> from scipy.stats import itemfreq
>>> x = [1,1,1,2,2,2,5,25,1,1]
>>> itemfreq(x)
array([[  1.,   5.],
       [  2.,   3.],
       [  5.,   1.],
       [ 25.,   1.]])

19voto

Eelco Hoogendoorn Points 2218

C'est de loin la plus générale et performant solution; surpris qu'il n'ait pas été publié pour le moment.

import numpy as np

def unique_count(a):
    unique, inverse = np.unique(a, return_inverse=True)
    count = np.zeros(len(unique), np.int)
    np.add.at(count, inverse, 1)
    return np.vstack(( unique, count)).T

print unique_count(np.random.randint(-10,10,100))

Contrairement à la actuellement accepté de répondre, il fonctionne sur n'importe quel type de données est triable (et pas seulement positif ints), et il a des performances optimales; la seule dépense importante est dans le tri fait par np.unique.

15voto

Bi Rico Points 9851

numpy.bincount est probablement le meilleur choix. Si votre tableau contient autre chose que les petites dense entiers, il pourrait être utile pour l'envelopper quelque chose comme ceci:

def count_unique(keys):
    uniq_keys = np.unique(keys)
    bins = uniq_keys.searchsorted(keys)
    return uniq_keys, np.bincount(bins)

Par exemple:

>>> x = array([1,1,1,2,2,2,5,25,1,1])
>>> count_unique(x)
(array([ 1,  2,  5, 25]), array([5, 3, 1, 1]))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X