python - array - Comprobando si todos los valores en una matriz numpy son iguales
python numpy arrays (3)
¿Por qué no usar numpy.array_equal(a1, a2)
[docs] de las funciones de NumPy?
Esta pregunta ya tiene una respuesta aquí:
- Comparando dos matrices numpy para la igualdad, 4 respuestas por elementos
Tengo una matriz cidimensional unidimensional que se debe llenar con el contenido de a + b
. Primero estoy ejecutando a + b
en un dispositivo usando PyOpenCL
.
Quiero determinar rápidamente la corrección de la matriz de resultados c
en python usando una numpy
.
Esto es lo que tengo actualmente
def python_kernel(a, b, c):
temp = a + b
if temp[:] != c[:]:
print "Error"
else:
print "Success!"
Pero me sale el error:
ValueError: el valor de verdad de una matriz con más de un elemento es ambiguo. Utilice a.any () o a.all ()
Pero parece que a.any
o a.all
determinará si los valores no son 0.
¿Qué debo hacer si quiero probar si todos los escaladores en la numpy
matriz numpy
son iguales a todos los valores de la matriz c
numpy
?
np.allclose es una buena opción si el tipo de datos np.array
es flotante. np.array_equal
no siempre funciona correctamente. Por ejemplo:
import numpy as np
def get_weights_array(n_recs):
step = - 0.5 / n_recs
stop = 0.5
return np.arange(1, stop, step)
a = get_weights_array(5)
b = np.array([1.0, 0.9, 0.8, 0.7, 0.6])
Resultado:
>>> a
array([ 1. , 0.9, 0.8, 0.7, 0.6])
>>> b
array([ 1. , 0.9, 0.8, 0.7, 0.6])
>>> np.array_equal(a, b)
False
>>> np.allclose(a, b)
True
>>> import sys
>>> sys.version
''2.7.3 (default, Apr 10 2013, 05:13:16) /n[GCC 4.7.2]''
>>> np.version.version
''1.6.2''
if np.any(a+b != c):
any
en el resultado de la comparación: if np.any(a+b != c):
o de manera equivalente if np.all(a+b == c):
a+b != c
crea una matriz de dtype=bool
, y luego any
mira esa matriz para ver si algún miembro es True
.
>>> import numpy as np
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,2])
>>> c = a+b
>>> c
array([5, 7, 5]) # <---- numeric, so any/all not useful
>>> a+b == c
array([ True, True, True], dtype=bool) # <---- BOOLEAN result, not numeric
>>> all(a+b == c)
True
Sin embargo, una vez dicho todo esto, la solución de Amber es probablemente más rápida, ya que no tiene que crear toda la matriz de resultados booleanos.