Em numpy
/ scipy
, existe uma maneira eficiente de obter contagens de frequência para valores exclusivos em uma matriz?
Algo nesse sentido:
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]]
(Para você, usuários R por aí, basicamente estou procurando a table()
função)
collections.Counter(x)
suficiente?Respostas:
Dê uma olhada em
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
E depois:
ou:
ou no entanto você deseja combinar as contagens e os valores exclusivos.
fonte
A partir do Numpy 1.9, o método mais fácil e rápido é simplesmente usar
numpy.unique
, que agora possui umreturn_counts
argumento de palavra - chave:Que dá:
Uma rápida comparação com
scipy.stats.itemfreq
:fonte
return_counts
argumento da palavra - chave não existia, o que poderia explicar a exceção. Nesse caso, os documentos sugerem quenp.unique(x, True)
é equivalente anp.unique(x, return_index=True)
, que não retorna contagens.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Quando esse recurso foi adicionado (veja aqui ), alguns testes informais tiveram o uso dereturn_counts
clock mais de 5x mais rápido.Atualização: o método mencionado na resposta original foi descontinuado. Em vez disso, devemos usar a nova maneira:
Resposta original:
você pode usar scipy.stats.itemfreq
fonte
Eu também estava interessado nisso, então fiz uma pequena comparação de desempenho (usando o perfplot , um projeto meu para animais de estimação). Resultado:
é de longe o mais rápido. (Observe a escala do log.)
Código para gerar o gráfico:
fonte
equality_check=array_sorteq
naperfplot.show()
. O que estava causando um erro (no Python 2) foipd.value_counts
(mesmo com sort = False).Usando o módulo pandas:
fonte
Essa é de longe a solução mais geral e com melhor desempenho; surpreso ainda não ter sido publicado.
Diferentemente da resposta atualmente aceita, funciona em qualquer tipo de dados que possa ser classificado (não apenas ints positivo) e possui desempenho ideal; a única despesa significativa está na classificação feita pelo np.unique.
fonte
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
é provavelmente a melhor escolha. Se sua matriz contiver algo além de números inteiros densos, pode ser útil agrupá-la da seguinte forma:Por exemplo:
fonte
Mesmo que já tenha sido respondido, sugiro uma abordagem diferente que faça uso
numpy.histogram
. Tal função, dada uma sequência, retorna a frequência de seus elementos agrupados em posições .Cuidado, porém : ele funciona neste exemplo porque os números são inteiros. Se eles onde números reais, então esta solução não se aplicaria tão bem.
fonte
Isso fornece: {1: 5, 2: 3, 5: 1, 25: 1}
fonte
collections.Counter(x)
também dá o mesmo resultado. Eu acredito que o OP quer uma saída que se assemelhe àtable
função R. Manter oSeries
pode ser mais útil.pd.Series(x).reshape(-1)
se for um array multidimensional.Para contar não inteiros únicos - semelhante à resposta de Eelco Hoogendoorn, mas consideravelmente mais rápido (fator 5 na minha máquina), eu costumava
weave.inline
combinarnumpy.unique
com um pouco de código c;Informações do perfil
numpy
Versão pura da Eelco :Nota
Há redundância aqui (também
unique
executa uma classificação), o que significa que o código provavelmente poderia ser otimizado ainda mais, colocando aunique
funcionalidade dentro do loop do código c.fonte
Pergunta antiga, mas eu gostaria de fornecer a minha própria solução, que acabou sendo a mais rápida, use o normal em
list
vez denp.array
como entrada (ou transfira para a lista primeiro), com base no meu teste de bancada.Confira se você o encontrar também.
Por exemplo,
100000 loops, o melhor de 3: 2,26 µs por loop
100000 loops, o melhor de 3: 8,8 µs por loop
100000 loops, o melhor de 3: 5,85 µs por loop
Embora a resposta aceita seja mais lenta, a
scipy.stats.itemfreq
solução é ainda pior.Um teste mais aprofundado não confirmou a expectativa formulada.
Ref. comentários abaixo sobre cache e outros efeitos colaterais na RAM que influenciam um pequeno conjunto de dados massivamente resultados de testes repetitivos.
fonte
numpy
não é necessariamente o caminho a percorrer.algo assim deve fazer:
Além disso, este post anterior sobre a contagem eficiente de elementos únicos parece bastante semelhante à sua pergunta, a menos que esteja faltando alguma coisa.
fonte
contagem de freqüência multidimensional, ou seja, contando matrizes.
fonte
fonte
fonte