En Python, tengo un ndarray y
que se imprime comoarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Estoy tratando de contar cuántos 0
sy cuántos 1
s hay en esta matriz.
Pero cuando escribo y.count(0)
o y.count(1)
, dice
numpy.ndarray
el objeto no tiene atributocount
¿Qué tengo que hacer?
python
numpy
multidimensional-array
count
mflowww
fuente
fuente
numpy.count_nonzero
.Respuestas:
Manera no numpy :
Uso
collections.Counter
;fuente
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
funcionó bien¿Qué pasa con el uso
numpy.count_nonzero
, algo comofuente
numpy.ndarray
como OP originalmente pidió.Personalmente, iría por:
(y == 0).sum()
y(y == 1).sum()
P.ej
fuente
sum( vector==value )
Para su caso, también puede buscar en numpy.bincount
fuente
Convierta su matriz
y
a la listal
y luego hagal.count(1)
yl.count(0)
fuente
Si sabes que son justos
0
y1
:te da el número de unos.
np.sum(1-y)
da los ceros.Para una ligera generalidad, si desea contar
0
y no cero (pero posiblemente 2 o 3):da el número de cero.
Pero si necesita algo más complicado, no creo que numpy le brinde una buena
count
opción. En ese caso, vaya a colecciones:Esto se comporta como un dictado
fuente
Si sabe exactamente qué número está buscando, puede usar lo siguiente;
devuelve cuántas veces se produjo 2 en su matriz.
fuente
Sinceramente, me resulta más fácil convertir a una serie de pandas o un marco de datos:
O este lindo one-liner sugerido por Robert Muil:
fuente
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Nadie sugiere utilizar
numpy.bincount(input, minlength)
conminlength = np.size(input)
, pero parece ser una buena solución, y sin duda el más rápido :Esa es una aceleración loca entre
numpy.unique(x, return_counts=True)
ynumpy.bincount(x, minlength=np.max(x))
!fuente
np.histogram
no calcula lo mismo. No tiene sentido comparar los tres enfoques que propongo con lahistogram
función, lo siento.bincount
embargo, @ Næreen solo funciona para enteros, por lo que funciona para el problema del OP, pero tal vez no para el problema genérico descrito en el título. ¿También has intentado usarbincount
con matrices con entradas muy grandes?bincount
es aproximadamente cuatro veces más rápido queunique
.¿Qué hay de
len(y[y==0])
ylen(y[y==1])
?fuente
y.tolist().count(val)
con val 0 o 1
Dado que una lista de Python tiene una función nativa
count
, la conversión a una lista antes de usar esa función es una solución simple.fuente
Otra solución simple podría ser usar numpy.count_nonzero () :
No dejes que el nombre te confunda, si lo usas con el booleano como en el ejemplo, funcionará.
fuente
Para contar el número de ocurrencias, puede usar
np.unique(array, return_counts=True)
:fuente
Yo usaría np.where:
fuente
Aproveche los métodos que ofrece una serie:
fuente
Una respuesta general y simple sería:
lo que resultaría en este código completo como ejemplo
Ahora, si MyArray tiene varias dimensiones y desea contar la ocurrencia de una distribución de valores en línea (= patrón de aquí en adelante)
fuente
Puede usar la comprensión del diccionario para crear una sola línea ordenada. Puede encontrar más información sobre la comprensión del diccionario aquí.
Esto creará un diccionario con los valores en su ndarray como claves, y los recuentos de los valores como los valores para las claves respectivamente.
Esto funcionará siempre que desee contar las ocurrencias de un valor en matrices de este formato.
fuente
Prueba esto:
fuente
Esto se puede hacer fácilmente en el siguiente método
fuente
Como su ndarray contiene solo 0 y 1, puede usar sum () para obtener la ocurrencia de 1s y len () - sum () para obtener la ocurrencia de 0s.
fuente
Tienes una matriz especial con solo 1 y 0 aquí. Entonces, un truco es usar
que le da el porcentaje de 1s en su matriz. Alternativamente, use
le dará el número absoluto de 1 y 0 en su matriz.
fuente
Acabo de copiar el comentario de Seppo Enarvi aquí que merece ser una respuesta adecuada
fuente
Implica un paso más, pero una solución más flexible que también funcionaría para matrices 2d y filtros más complicados es crear una máscara booleana y luego usar .sum () en la máscara.
fuente
Si no desea usar numpy o un módulo de colecciones, puede usar un diccionario:
resultado:
Por supuesto, también puede usar una instrucción if / else. Creo que la función de contador hace casi lo mismo, pero esto es más transparente.
fuente
Para entradas genéricas:
Producirá un recuento:
E índices:
fuente
Aquí tengo algo, a través del cual puede contar el número de ocurrencias de un número particular: de acuerdo con su código
count_of_zero = list (y [y == 0]). count (0)
print (cuenta_de_cero)
// según la coincidencia habrá valores booleanos y según el valor verdadero se devolverá el número 0
fuente
Si está interesado en la ejecución más rápida, sabe de antemano qué valores buscar y su matriz es 1D, o le interesa el resultado en la matriz aplanada (en cuyo caso, la entrada de la función debería ser en
np.flatten(arr)
lugar de soloarr
), entonces Numba es tu amiga:o, para matrices muy grandes donde la paralelización puede ser beneficiosa:
Comparación de estos contra
np.count_nonzero()
(que también tiene un problema de crear una matriz temporal que se puede evitar) y unanp.unique()
solución basadapara entrada generada con:
se obtienen los siguientes gráficos (la segunda fila de gráficos es un zoom en el enfoque más rápido):
Mostrando que la solución basada en Numba es notablemente más rápida que las contrapartes de NumPy y, para entradas muy grandes, el enfoque paralelo es más rápido que el ingenuo.
Código completo disponible aquí .
fuente
Si se trata de matrices muy grandes con generadores podría ser una opción. Lo bueno aquí es que este enfoque funciona bien tanto para matrices como para listas y no necesita ningún paquete adicional. Además, no está utilizando tanta memoria.
fuente
Numpy tiene un módulo para esto. Solo un pequeño truco. Ponga su matriz de entrada como contenedores.
La salida son 2 matrices. Uno con los valores en sí, otro con las frecuencias correspondientes.
fuente
fuente