No Python, eu tenho um ndarray y
impresso comoarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Estou tentando contar quantos se há 0
quantos 1
nesta matriz.
Mas quando eu digito y.count(0)
ou y.count(1)
, diz
numpy.ndarray
objeto não tem atributocount
O que devo fazer?
python
numpy
multidimensional-array
count
mflowww
fonte
fonte
numpy.count_nonzero
.Respostas:
Maneira não-numpy :
Use
collections.Counter
;fonte
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
funcionou muito bem #Que tal usar
numpy.count_nonzero
algo comofonte
numpy.ndarray
como o OP originalmente pediu.Pessoalmente, eu iria para:
(y == 0).sum()
e(y == 1).sum()
Por exemplo
fonte
sum( vector==value )
Para o seu caso, você também pode procurar numpy.bincount
fonte
Converta sua matriz
y
em listal
e façal.count(1)
el.count(0)
fonte
Se você sabe que eles são justos
0
e1
:fornece o número de unidades.
np.sum(1-y)
dá os zeros.Por uma ligeira generalidade, se você deseja contar
0
e não zero (mas possivelmente 2 ou 3):fornece o número de diferente de zero.
Mas se você precisar de algo mais complicado, não acho que o numpy forneça uma boa
count
opção. Nesse caso, vá para coleções:Isso se comporta como um ditado
fonte
Se você souber exatamente qual número está procurando, poderá usar o seguinte;
retorna quantas vezes 2 ocorreu em sua matriz.
fonte
Honestamente, acho mais fácil converter para uma série de pandas ou DataFrame:
Ou este belo artigo sugerido por Robert Muil:
fonte
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Ninguém sugeriu usar
numpy.bincount(input, minlength)
comminlength = np.size(input)
, mas parece ser uma boa solução, e definitivamente o mais rápido :Essa é uma aceleração louca entre
numpy.unique(x, return_counts=True)
enumpy.bincount(x, minlength=np.max(x))
!fonte
np.histogram
não calcula a mesma coisa. Não faz sentido comparar as três abordagens que proponho com ahistogram
função, desculpe.bincount
funciona apenas para números inteiros, portanto, funciona para o problema do OP, mas talvez não para o problema genérico descrito no título. Você também tentou usarbincount
matrizes com ints muito grandes?bincount
é cerca de quatro vezes mais rápido queunique
.Que tal
len(y[y==0])
elen(y[y==1])
?fonte
y.tolist().count(val)
com val 0 ou 1
Como uma lista python possui uma função nativa
count
, a conversão em lista antes de usar essa função é uma solução simples.fonte
Ainda outra solução simples pode ser usar numpy.count_nonzero () :
Não deixe o nome te enganar, se você o usar com o booleano, como no exemplo, ele fará o truque.
fonte
Para contar o número de ocorrências, você pode usar
np.unique(array, return_counts=True)
:fonte
Eu usaria np.where:
fonte
tire proveito dos métodos oferecidos por uma série:
fonte
Uma resposta geral e simples seria:
o que resultaria nesse código completo como exemplo
Agora, se MyArray está em várias dimensões e você deseja contar a ocorrência de uma distribuição de valores na linha (= padrão a seguir)
fonte
Você pode usar a compreensão de dicionário para criar uma linha única. Mais informações sobre a compreensão do dicionário podem ser encontradas aqui
Isso criará um dicionário com os valores em seu ndarray como chaves e as contagens dos valores como valores para as chaves, respectivamente.
Isso funcionará sempre que você desejar contar ocorrências de um valor em matrizes desse formato.
fonte
Tente o seguinte:
fonte
Isso pode ser feito facilmente no seguinte método
fonte
Como o ndarray contém apenas 0 e 1, você pode usar sum () para obter a ocorrência de 1s e len () - sum () para obter a ocorrência de 0s.
fonte
Você tem uma matriz especial com apenas 1 e 0 aqui. Então, um truque é usar
que fornece a porcentagem de 1s em sua matriz. Como alternativa, use
fornecerá o número absoluto de 1 e 0 em sua matriz.
fonte
Apenas copiei o comentário de Seppo Enarvi aqui, que merece ser uma resposta adequada
fonte
Isso envolve mais uma etapa, mas uma solução mais flexível que também funcionaria para matrizes 2D e filtros mais complicados é criar uma máscara booleana e usar .sum () na máscara.
fonte
Se você não quiser usar o numpy ou um módulo de coleções, use um dicionário:
resultado:
Claro que você também pode usar uma instrução if / else. Eu acho que a função Counter faz quase a mesma coisa, mas isso é mais transparente.
fonte
Para entradas genéricas:
Irá gerar uma contagem:
E índices:
fonte
aqui eu tenho algo, através do qual você pode contar o número de ocorrência de um número específico: de acordo com seu código
count_of_zero = lista (y [y == 0]). count (0)
print (count_of_zero)
// de acordo com a correspondência, haverá valores booleanos e de acordo com o valor True, o número 0 será retornado
fonte
Se você estiver interessado na execução mais rápida, você sabe com antecedência quais valores procurar e sua matriz é 1D ou se interessa pelo resultado da matriz achatada (nesse caso, a entrada da função deve seja em
np.flatten(arr)
vez de apenasarr
), então Numba é seu amigo:ou, para matrizes muito grandes em que a paralelização pode ser benéfica:
Comparando-os
np.count_nonzero()
(que também tem um problema de criar uma matriz temporária que pode ser evitada) enp.unique()
solução baseada empara entrada gerada com:
as seguintes plotagens são obtidas (a segunda linha de plotagens é um zoom na abordagem mais rápida):
Mostrando que a solução baseada no Numba é visivelmente mais rápida que a do NumPy e, para entradas muito grandes, a abordagem paralela é mais rápida que a ingênua.
Código completo disponível aqui .
fonte
se você estiver lidando com matrizes muito grandes usando geradores, pode ser uma opção. O bom aqui é que essa abordagem funciona bem para matrizes e listas e você não precisa de nenhum pacote adicional. Além disso, você não está usando tanta memória.
fonte
Numpy tem um módulo para isso. Apenas um pequeno truque. Coloque sua matriz de entrada como caixas.
A saída são 2 matrizes. Um com os próprios valores, outro com as frequências correspondentes.
fonte
fonte