array all python matplotlib

python array any all



ValueError: el valor de verdad de una matriz con más de un elemento es ambiguo. Use a.any() o a.all() (3)

El motivo de la excepción es eso and implícitamente llama bool . Primero en el operando izquierdo y (si el operando izquierdo es True ) luego en el operando derecho. Entonces x and y es equivalente a bool(x) and bool(y) .

Sin embargo, el bool en numpy.ndarray (si contiene más de un elemento) arrojará la excepción que ha visto:

>>> import numpy as np >>> arr = np.array([1, 2, 3]) >>> bool(arr) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

La llamada bool() está implícita en and , pero también en if , while , or , por lo que cualquiera de los siguientes ejemplos también fallará:

>>> arr and arr ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> if arr: pass ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> while arr: pass ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> arr or arr ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Hay más funciones y sentencias en Python que ocultan llamadas bool , por ejemplo 2 < x < 10 es simplemente otra forma de escribir 2 < x and x < 10 . Y el and llamará a bool : bool(2 < x) and bool(x < 10) .

El elemento equivalente para and sería la función np.logical_and , del mismo modo podría usar np.logical_or como equivalente para or .

Para las matrices booleanas, y las comparaciones como < , <= , == != , >= Y > en las matrices NumPy devuelven las matrices booleanas NumPy; también puede usar las funciones bitwise de elementos (y operadores): np.bitwise_and ( & operador)

>>> np.logical_and(arr > 1, arr < 3) array([False, True, False], dtype=bool) >>> np.bitwise_and(arr > 1, arr < 3) array([False, True, False], dtype=bool) >>> (arr > 1) & (arr < 3) array([False, True, False], dtype=bool)

y bitwise_or ( | operador):

>>> np.logical_or(arr <= 1, arr >= 3) array([ True, False, True], dtype=bool) >>> np.bitwise_or(arr <= 1, arr >= 3) array([ True, False, True], dtype=bool) >>> (arr <= 1) | (arr >= 3) array([ True, False, True], dtype=bool)

Se puede encontrar una lista completa de funciones lógicas y binarias en la documentación de NumPy:

Acabo de descubrir un error lógico en mi código que causaba todo tipo de problemas. Estaba haciendo inadvertidamente un Y a nivel de bits en lugar de un Y lógico .

Cambié el código de:

r = mlab.csv2rec(datafile, delimiter='','', names=COL_HEADERS) mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate)) selected = r[mask]

A:

r = mlab.csv2rec(datafile, delimiter='','', names=COL_HEADERS) mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate)) selected = r[mask]

Para mi sorpresa, recibí el mensaje de error bastante críptico:

ValueError: el valor de verdad de una matriz con más de un elemento es ambiguo. Use a.any () o a.all ()

¿Por qué no se emitió un error similar cuando uso una operación bit a bit, y cómo soluciono esto?


Tuve el mismo problema (es decir, indexar con condiciones múltiples, aquí se encuentran los datos en un determinado rango de fechas). El (ab).any() o (ab).all() parecen no funcionar, al menos para mí.

Alternativamente, encontré otra solución que funciona perfectamente para mi funcionalidad deseada (https://.com/questions/12647471/the-truth-value-of-an-array-with-more-than-one-element-is-ambigous-when-trying-t ).

En lugar de usar el código sugerido arriba, simplemente usar un numpy.logical_and(a,b) funcionaría. Aquí es posible que desee volver a escribir el código como

selected = r(logical_and(r["dt"] >= startdate, r["dt"] <= enddate))


r es una matriz numpy (rec). Entonces, r["dt"] >= startdate también es una matriz (booleana). Para matrices numpy, la operación & devuelve el bitwise-y de las dos matrices booleanas.

Los desarrolladores de NumPy consideraron que no había una forma común de evaluar una matriz en contexto booleano: podría significar True si cualquier elemento es True o podría significar True si todos los elementos son True o True si la matriz tiene una longitud distinta de cero , solo para nombrar tres posibilidades.

Dado que diferentes usuarios pueden tener diferentes necesidades y suposiciones diferentes, los desarrolladores de NumPy se negaron a adivinar y en su lugar decidieron generar un ValueError cada vez que se intenta evaluar una matriz en contexto booleano. La aplicación de dos matrices numpy hace que las dos matrices se evalúen en un contexto booleano (llamando a __bool__ en Python3 o __nonzero__ en Python2).

Tu código original

mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate)) selected = r[mask]

se ve correcto Sin embargo, si lo desea and , a continuación, en lugar de a and b use (ab).any() o (ab).all() .